热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过简易查询有效识别和解决数据库死锁问题

我有一项服务,可以插入和更新表中的行。当有人同时启动20个对该服务的

我有一项服务,可以插入和更新表中的行。

当有人同时启动20个对该服务的调用时,问题就开始了,导致某些事务因死锁错误而回滚。

"Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."

关于这一点的事情是,我的查询在逻辑上无法陷入僵局。

我的服务有4个不同的查询,但是我们可以忽略其中的2个,因为它们是单行插入,不需要时不需要锁定任何行。

另外两个查询是这样的:

UPDATE Documents SET read = 1 WHERE id = ?

UPDATE Documents SET name = ?,title = ? WHERE id = ?

没有两行具有相同的id,所以我不明白如何发生互锁。

我正在使用以下语句:

try {
PreparedStatement st = con.prepareStatement(updateQuery);
st.setString(1,true);
int rowsUpdated = st.executeUpdate();
if(rowsUpdated == 0) {
st = con.prepareStatement(insertQuery);
st.setString(1,"example");
[...]
st.executeUpdate();
}

我正在使用SQL Server 2016 sqljdbc4库。我可以提供任何其他有用的信息。



解决方案是索引where子句中的列。

似乎查询在SCANNING而不是SEEKING特定行的同时阻止了所有行。


推荐阅读
author-avatar
花落酒未醉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有