2008-12-05 6 views
1

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

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

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

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

ответ

2
  1. увеличить уровень изоляции транзакций в eulerfx.myopenid.com намекая.

  2. использовать sql "mutexes", чтобы просто дождаться завершения процедуры, прежде чем использовать другую для запуска. 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, хотя. но иногда вы не можете просто увеличить уровень изоляции.