Если выполнять указанный ниже кусок кода в 3х параллельных потоках, то:
1) Один поток захватывает, остальные ждут (ожидаемое поведение)
2) После разблокирования еще один поток захватывает, а вот остальные падают с "Transaction (Process ID 71) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."
set transaction isolation level serializable
begin tran
update [log].[LockerForChange] set [DateAdd] = sysdatetime();
Здравствуйте, mch-mf.ru, Вы писали:
MMR>Если выполнять указанный ниже кусок кода в 3х параллельных потоках, то: MMR>1) Один поток захватывает, остальные ждут (ожидаемое поведение) MMR>2) После разблокирования еще один поток захватывает, а вот остальные падают с "Transaction (Process ID 71) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction." MMR>set transaction isolation level serializable
MMR>...
Начать с получения Deadlock graph с помощью профайлера, а дальше действовать по результатам
Re: Deadlock возникающий при 3х и более параллельных транзак
On 04/10/2012 12:40 PM, mch-mf.ru wrote:
> Если выполнять указанный ниже кусок кода в 3х параллельных потоках, то:
Я даже смотреть не буду что оно там делает.
> Подскажите пожалуйста, что мне с этим делать?
С "этим" делать то же, что должно делать любое приложение
для обработки ситуации дедлока, которая вообще-то неизбежна в любой БД.
А именно -- приложение должно
-- откатить текущую транзакцию (в которой возник дедлок), если это СУБД не
делает автоматически.
-- повторить последнюю транзакцию сначала.
Posted via RSDN NNTP Server 2.1 beta
Re: Deadlock возникающий при 3х и более параллельных транзак
> 2) После разблокирования еще один поток захватывает, а вот остальные падают с > "Transaction (Process ID 71) was deadlocked on lock resources with another > process and has been chosen as the deadlock victim. Rerun the transaction."
А СУБД какая ?
Posted via RSDN NNTP Server 2.1 beta
Re: Deadlock возникающий при 3х и более параллельных транзак
MMR>update [log].[LockerForChange] set [DateAdd] = sysdatetime();
Это означает, что команда выше ставит несколько блокировок и, при этом, порядок их получения не гарантирован.
Сколько строк в таблице? Есть ли на таблице кластерный индекс? Попробуйте создать, если нет.
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Re[2]: Deadlock возникающий при 3х и более параллельных тран
Здравствуйте, MasterZiv, Вы писали:
MZ>On 04/10/2012 12:40 PM, mch-mf.ru wrote:
>> Если выполнять указанный ниже кусок кода в 3х параллельных потоках, то:
MZ>Я даже смотреть не буду что оно там делает.
>> Подскажите пожалуйста, что мне с этим делать?
MZ>С "этим" делать то же, что должно делать любое приложение MZ>для обработки ситуации дедлока, которая вообще-то неизбежна в любой БД. MZ>А именно -- приложение должно MZ>-- откатить текущую транзакцию (в которой возник дедлок), если это СУБД не MZ>делает автоматически. MZ>-- повторить последнюю транзакцию сначала.
Автор вопроса как раз и пытался избежать такого решения.
Модель с повтором транзакции — это optimistic concurrency, автору же нужно pessimistic — один делает, все остальные ждут в очереди.
И проблема у него в том, что вся очередь в дверь одновременно полезла.
> Автор вопроса как раз и пытался избежать такого решения. > Модель с повтором транзакции — это optimistic concurrency, автору же нужно > pessimistic — один делает, все остальные ждут в очереди. > И проблема у него в том, что вся очередь в дверь одновременно полезла.
DEADLOCK-и есть везде и всегда, к ним надо быть всегда готовым.
Posted via RSDN NNTP Server 2.1 beta
Re: Deadlock возникающий при 3х и более параллельных транзак