Взаимоблокировка SQL Server 2005 по ключу

У меня есть таблица с кластеризованным индексом первичного ключа в столбце uniqueidentifier. У меня есть процедура, которая запускает следующие псевдо-функции:

begin transaction
read from table 1
insert into table 2
update table 1 with pointer to table 2 record
commit transaction

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

Есть идеи, что я могу сделать, чтобы предотвратить это, если не сказать просто «не запускайте его одновременно»? Транзакции в настоящее время выполняются на уровне изоляции READ COMMITTED.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
530
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
  1. увеличьте уровень изоляции транзакции, как намекает eulerfx.myopenid.com.

  2. используйте sql «мьютексы», чтобы просто дождаться завершения процедуры, прежде чем разрешить выполнение другой. http://weblogs.sqlteam.com/mladenp/archive/2008/01/08/Application-Locks-or-Mutexes-in-SQL-Server-2005.aspx

  3. использовать уровень изоляции моментального снимка. в зависимости от того, что делает ваше приложение, это может сработать. однако это приводит к другим проблемам. http://msdn.microsoft.com/en-us/library/ms189050.aspx

номер 2 требует большего количества изменений кода, чем 1. но иногда нельзя просто повысить уровень изоляции.

Другие вопросы по теме