Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать блокировку таблицы? 
:(
    Опции темы
Povter3092
Дата 22.6.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.2.2010

Репутация: нет
Всего: нет



Ребята, подскажите, пожалуйста, как можно реализовать блокировку таблицы. Т.е. я хочу выполнить следующий запрос как атомарную комманду:

DECLARE @id int
SELECT TOP 1 @id = Id FROM _docIdPool
DELETE FROM _docIdPool WHERE Id = @Id
SELECT @id


PM MAIL   Вверх
tusha
Дата 22.6.2010, 13:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Код

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

?

Добавлено через 1 минуту и 52 секунды
ну и соответственно begin/commit transaction

Добавлено через 3 минуты и 52 секунды
PS
непонятно почему ТОР 1 - для реляционных баз нету такого понятия как первая/вторая.. последняя запись в таблице. есть ключ, по нему и надо работать
PM MAIL   Вверх
Povter3092
Дата 23.6.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 2.2.2010

Репутация: нет
Всего: нет



Привет tusha. Спасибо за совет, но, к сожалению, твое решение не работает. Когда одновремено пытаются выполнить эту операцию 5 пользователей выдаётся следующая ошибка:
      Transaction (Process ID 85) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Моя проблема заключается в следующем. У меня есть некоторая таблица с уникальными значениями. Я хочу по запросу каждому пользователю выдавать значение из этой таблицы и сразу же его удалять, чтобы никакие два пользователя не получили одинакового значения.

Подскажите, пожалуйста, какое-нибудь решение.


PM MAIL   Вверх
kobra
Дата 24.6.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 5
Всего: 9



Цитата(Povter3092 @  23.6.2010,  14:53 Найти цитируемый пост)
 Спасибо за совет, но, к сожалению, твое решение не работает.
как не работает? работает.
Цитата(Povter3092 @  23.6.2010,  14:53 Найти цитируемый пост)
Transaction (Process ID 85) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
проблема в том что медленно работает и таблица долго заната.
Цитата(Povter3092 @  23.6.2010,  14:53 Найти цитируемый пост)
Моя проблема заключается в следующем. У меня есть некоторая таблица с уникальными значениями. Я хочу по запросу каждому пользователю выдавать значение из этой таблицы и сразу же его удалять, чтобы никакие два пользователя не получили одинакового значения.
если генерить на хаду, будет быстрее. может такои вариант подоидет?

PM MAIL   Вверх
tusha
Дата 25.6.2010, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



если транзакции долго ожидают снятия взаимоблокировки , то одна из них (меньшая по затратам) через некоторое время откатывается. хотя непонятно почему возникла мертвая взаимоблокировка - по идее транзакции при этом виде изоляции попросту выстраиваются в очередь. возможно это случилось когда уже какая-нибудь другая транзакция начала читать/изменять данные. попробуйте откройте 5 коннектов, в цикле на 1000 скажем итераций повторите эти действия).

Добавлено @ 09:58
http://www.rsdn.ru/article/db/deadlocks.xml

Это сообщение отредактировал(а) tusha - 25.6.2010, 12:04
PM MAIL   Вверх
NURMS
Дата 21.7.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Если для каждой транзакции использована SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, то в цикле получится deadlock, причём самый классический вариант.

А если оставить TRANSACTION ISOLATION LEVEL READ COMMITTED, то тут по идее взаимoблокировок быть не должно, зато будет чтение несуществующих данных.

Добавлено через 2 минуты и 12 секунд
А можно и сделать так:

Код


begin transaction
DECLARE @id int
SELECT TOP 1 @id = Id FROM _docIdPool with(updlock)
DELETE FROM _docIdPool WHERE Id = @Id
SELECT @id
commit transaction


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.