如何解决Microsoft SQL Server数据库死锁问题

2022-03-30 00:00:00 数据库 专区 事务 死锁 启用
使用Microsoft SQL Server在Java Spring Boot时如果应用程序中处理数据库死锁,错误如下所示:
Exception is org.springframework.dao.CannotAcquireLockException: could not execute query; SQL ; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute query] with root causecom.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 132) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
当用户上传正在写入数据库的文件时,数据库死锁导致。当上传文件时,用户导航到另一个页面,在那里查询来自同一个表的数据。
在调试SQL Server跟踪时,我们发现行级锁升级为表锁。这将导致SQL Server停止其他事务访问该表。

为了解决这个问题,我们为数据库启用了READ_COMMITTED_SNAPSHOT选项,以便它使用READ_COMMITTED和行版本隔离策略。在SQL Server中,默认的数据库隔离级别是READ_COMMITTED,这意味着当前事务中的查询不能读取其他事务修改的数据,而其他事务还没有提交,从而防止脏读。隔离级别使用共享锁定或行版本控制来防止脏读,这取决于READ_COMMITTED_SNAPSHOT数据库选项是否启用。

由于wee启用了READ_COMMITTED_SNAPSHOT, SQL Server将使用版本控制而不是锁。

ALTER DATABASE <database name>   SET READ_COMMITTED_SNAPSHOT ON   WITH ROLLBACK IMMEDIATE;
来源 | DZone
作者 | shekhargulati
编辑 | LENA
来源 https://mp.weixin.qq.com/s/mhTcPuZJAXZmqCwKWvCjyQ

相关文章