Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中,此并发更新方案是否需要事务/锁_Sql Server_Concurrency_Transactions_Locks - Fatal编程技术网

Sql server 在SQL Server中,此并发更新方案是否需要事务/锁

Sql server 在SQL Server中,此并发更新方案是否需要事务/锁,sql-server,concurrency,transactions,locks,Sql Server,Concurrency,Transactions,Locks,我想知道在下面的场景中我是否真的需要事务/锁。我可以执行3个操作,这些操作可能在任意数量的操作中同时进行(即,我可以运行两个Task 1和三个Task 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 = count

我想知道在下面的场景中我是否真的需要事务/锁。我可以执行3个操作,这些操作可能在任意数量的操作中同时进行(即,我可以运行两个Task 1和三个Task 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;
我应该如何实现上述功能以确保我永远不会损坏表2的字段
计数器


多谢各位

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

以下几点:

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

我不会说触发器本身执行任何锁定。我认为这个答案不正确。