作者:花落酒未醉 | 来源:互联网 | 2024-10-22 11:40
我有一项服务,可以插入和更新表中的行。
当有人同时启动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
特定行的同时阻止了所有行。