多用户下数据库死锁的问题
我们有一个应用系统,已经开发完毕,在实际使用过程发现有时会发生deadlock的情况,通过log sql语句,模拟出了这样的例子:
--Process A:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION
UPDATE TABLE1 SET TTT='2' WHERE ID = '2'
waitfor delay '00:00:05'
UPDATE TABLE2 SET TTT='2' WHERE ID = '1'
exec sp_lock
COMMIT TRANSACTION
--Process B:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION
UPDATE TABLE2 SET TTT='2' WHERE ID = '2'
waitfor delay '00:00:05'
UPDATE TABLE1 SET TTT='2' WHERE ID = '1'
exec sp_lock
COMMIT TRANSACTION
TABLE1 和 TABLE2 都是一样的结构:
Field: ID, Type: VARCHAR 20 (PK)
Field: TTT, Type: VARCHAR 20
开2个查询分析器,同时运行A和B,就可以重现死锁的情况。
看到的锁类型是键范围锁定,而按照SQL Server的联机文档说明在READ UNCOMMITTED的事务之下,对应主键行的更新应该是行锁定才对。
我修改PK的type到numeric,却是没有这样的问题。SQL Server难道对于不同的主键类型的锁定策略是不一样的吗?
系统已经完成了,不想修改原有的代码,能否有其他变通的方式?
谢谢!