您的两个语句以不同的顺序获取行锁。这是死锁的典型案例。您可以通过确保所采用的锁定顺序始终处于某种全局顺序(例如,按ID顺序)来解决此问题。您可能应该将这两个UPDATE
语句合并为一个,并在将客户端上的ID列表排序之前,将其发送到sql Server。对于许多典型的UPDATE
计划,它实际上可以正常工作(尽管不能保证)。
或者,您添加重试逻辑以防检测到死锁(sqlException.Number == 1205
)。这更优雅,因为它不需要更深层的代码更改。但是死锁会对性能产生影响,因此只有在低死锁率时才这样做。
如果您的并行处理生成大量更新,则可以将INSERT
所有这些更新放入一个临时表中(可以同时进行),完成后,您执行一个大操作UPDATE
,将所有单独的更新记录复制到主表中。您只需在示例查询中更改联接源。