【问题标题】:Do I need transactions/locks for this concurrent update scenario in SQL Server我是否需要 SQL Server 中的此并发更新方案的事务/锁
【发布时间】:2012-03-17 10:10:42
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: sql-server concurrency transactions locks


    【解决方案1】:

    几点:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我不会说触发器本身会进行任何锁定。我不认为这个答案是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2017-03-20
      相关资源
      最近更新 更多