一个非常简单的查询死锁

Deadlock with a very simple query

我有一项服务可以从 table.

中插入和更新行

当有人同时启动 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 个,因为它们是单行插入,不需要锁定任何行。

其他 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 特定行。