Нужны ли транзакции / блокировки для этого параллельного сценария обновления в SQL Server - PullRequest
1 голос
/ 17 марта 2012

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

Задание 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;

Как мне реализовать вышесказанное, будучи уверенным, что я никогда не испорчу поле table_2 counter?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 17 марта 2012

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

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

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

...