2012-03-17 2 views
1

Мне интересно, действительно ли мне нужны транзакции/блокировки в следующем сценарии. Я могу выполнить 3 операции, которые могут быть одновременно в любом количестве из них (то есть я мог бы иметь две задачи: 1 ход и три задачи 2 работает):Мне нужны транзакции/блокировки для этого параллельного сценария обновления в SQL Server

Задача 1:

select distinct count(some_id) as my_counter from table_1; 
update table_2 set counter = my_counter; 

Задача 2:

insert into table_1 ...; 
update table_2 set counter = counter + 1; 

Задача 3:

delete from table_1 where id = ...; 
update table_2 set counter = counter - 1; 

Как я должен выполнять выше будучи уверенным, что я никогда не буду корр upt table_2's field counter?

спасибо!

ответ

1

Несколько моментов:

  • В любом случае вам необходимо приложить два заявления каждой задачи в транзакции.
  • Я думаю, вам нужен уровень изоляции транзакционных транзакций. Ничего меньше не будет. Например, с помощью задачи «repeatable read» 1 может быть установлено значение table_2.counter для устаревшего значения.
  • Вам нужно всегда обращаться к таблице_1 перед таблицей_2. Это обеспечит согласованное блокирование, предотвращающее взаимоблокировки.
-1

Вы можете использовать TRIGGER для задачи 2,3. он блокирует ваши таблицы соответствующим образом. для Task 1 вы должны использовать XLOCK для блокировки строк в транзакции

+0

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