1

我想知道在以下情况下我是否真的需要事务/锁。我可以执行 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

非常感谢你!

4

2 回答 2

1

几点:

  • 在任何情况下,您都需要将每个任务的两个语句包含在事务中。
  • 我认为您需要可序列化的事务隔离级别。少一点都不行。例如,使用“可重复读取”任务 1 可能会将 table_2.counter 设置为陈旧值。
  • 您需要始终在 table_2 之前访问 table_1。这将确保一致的锁定顺序防止死锁。
于 2012-03-17T13:15:03.463 回答
-1

您可以TRIGGER用于任务 2,3。它以适当的方式锁定您的表。因为Task 1您应该XLOCK在事务中使用行锁

于 2012-03-17T12:45:28.993 回答