![]() |
Модераторы: Akina |
![]() ![]() ![]() |
|
Povter3092 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 2.2.2010 Репутация: нет Всего: нет |
Ребята, подскажите, пожалуйста, как можно реализовать блокировку таблицы. Т.е. я хочу выполнить следующий запрос как атомарную комманду:
DECLARE @id int SELECT TOP 1 @id = Id FROM _docIdPool DELETE FROM _docIdPool WHERE Id = @Id SELECT @id |
|||
|
||||
tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
? Добавлено через 1 минуту и 52 секунды ну и соответственно begin/commit transaction Добавлено через 3 минуты и 52 секунды PS непонятно почему ТОР 1 - для реляционных баз нету такого понятия как первая/вторая.. последняя запись в таблице. есть ключ, по нему и надо работать |
|||
|
||||
Povter3092 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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. Моя проблема заключается в следующем. У меня есть некоторая таблица с уникальными значениями. Я хочу по запросу каждому пользователю выдавать значение из этой таблицы и сразу же его удалять, чтобы никакие два пользователя не получили одинакового значения. Подскажите, пожалуйста, какое-нибудь решение. |
|||
|
||||
kobra |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 5 Всего: 9 |
как не работает? работает.
если генерить на хаду, будет быстрее. может такои вариант подоидет? |
|||
|
||||
tusha |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 17.7.2008 Репутация: нет Всего: 1 |
если транзакции долго ожидают снятия взаимоблокировки , то одна из них (меньшая по затратам) через некоторое время откатывается. хотя непонятно почему возникла мертвая взаимоблокировка - по идее транзакции при этом виде изоляции попросту выстраиваются в очередь. возможно это случилось когда уже какая-нибудь другая транзакция начала читать/изменять данные. попробуйте откройте 5 коннектов, в цикле на 1000 скажем итераций повторите эти действия).
Добавлено @ 09:58 http://www.rsdn.ru/article/db/deadlocks.xml Это сообщение отредактировал(а) tusha - 25.6.2010, 12:04 |
|||
|
||||
NURMS |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 20.4.2007 Репутация: нет Всего: нет |
Если для каждой транзакции использована SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, то в цикле получится deadlock, причём самый классический вариант.
А если оставить TRANSACTION ISOLATION LEVEL READ COMMITTED, то тут по идее взаимoблокировок быть не должно, зато будет чтение несуществующих данных. Добавлено через 2 минуты и 12 секунд А можно и сделать так:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |