Sql server SQL Server更新是顺序更新还是并行更新?

Sql server SQL Server更新是顺序更新还是并行更新?,sql-server,Sql Server,我有一个过程,它只有两个update语句。两者都在同一个表上,根据不同的列更新数据。比如说 update table1 set column1 = somevalue, column2 = somevalue where column3 = somevalue update table1 set column3 = somevalue, column2 = somevalue where column1 = somevalue Process A starts, and update

我有一个过程,它只有两个update语句。两者都在同一个表上,根据不同的列更新数据。比如说

update table1 
set column1 = somevalue, column2 = somevalue 
where column3 = somevalue

update table1 
set column3 = somevalue, column2 = somevalue 
where column1 = somevalue
Process A starts, and updates row 1
Process B starts, and updates row 2
Process A now wants to update row 2, and must wait for Process B to commit
Process B now wants to update row 1, and must wait for Process A to commit
我偶尔会出错

事务进程ID不同的编号在与另一个进程的锁|通信缓冲区资源上被死锁,并被选为死锁受害者

当我使用命令sp_who签入SQL Server时,进程id指向同一个存储过程

可能存在两个update语句都可以更新同一行的情况。这能成为僵局的原因吗

CREATE PROCEDURE update_tib_details
    (@tib_id INT, @sys_id INT)
AS
BEGIN
    UPDATE tib_sys_asc
    SET tib_id = @tib_id
    WHERE sys_id = @sys_id

    UPDATE tib_sys_asc           
    SET sys_id = @sys_id
    WHERE tib_id = @tib_id
END

如果更新在同一进程中执行,则不会发生这种情况。单个进程本身不会导致死锁

如果此更新由其他进程触发,并且没有受到并发保护,则可能会遇到死锁

当两个进程都处于事务中间,并且在继续之前等待另一个进程完成时,就会发生死锁。例如,在这种情况下

update table1 
set column1 = somevalue, column2 = somevalue 
where column3 = somevalue

update table1 
set column3 = somevalue, column2 = somevalue 
where column1 = somevalue
Process A starts, and updates row 1
Process B starts, and updates row 2
Process A now wants to update row 2, and must wait for Process B to commit
Process B now wants to update row 1, and must wait for Process A to commit
数据库引擎非常擅长检测这些交叉依赖,并选择要终止的进程。如果进程B被终止,进程A最终可以更新第2行并提交,反之亦然


在你的情况下,你应该决定什么是合适的最终结果。如果您不关心wins中最后完成的操作顺序,那么只需在每次更新后提交即可。如果您愿意,那么您应该能够围绕整个操作编写一个独占锁,即进程B等待整个进程A完成。

在这里共享您的过程代码会有很大帮助。添加的代码示例谢谢。我没有在我的过程中使用事务。必须有其他一些正在运行的作业试图同时更新同一个表。找到另一个进程或处理此问题的最佳方法是什么。实际上,您的过程使用的是事务,它们只是隐式的。每个DDL语句始终使用一个事务。这是由于原子和耐用性方面的酸性原理。