Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过一个非常简单的查询实现死锁_Java_Sql Server_Jdbc_Deadlock - Fatal编程技术网

Java 通过一个非常简单的查询实现死锁

Java 通过一个非常简单的查询实现死锁,java,sql-server,jdbc,deadlock,Java,Sql Server,Jdbc,Deadlock,我有一个从表中插入和更新行的服务 当有人同时启动20个服务调用时,问题就开始了,导致一些事务回滚并出现死锁错误 "Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction." 这方面的问题是,我的查询在逻辑上不能遇到死区 我的服务有4个不同的查询,但我们可以忽略其

我有一个从表中插入和更新行的服务

当有人同时启动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 = ?

没有两行具有相同的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
子句中的列编制索引


似乎查询在
扫描
时阻塞了所有行,而不是
查找
特定行。

死锁的xml报告会有所帮助。它可以从扩展事件会话中获取。还可以提供DDL,包括表的索引。死锁可能发生在非聚集索引和受级联外键影响的相关表上。
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();


            }