Тупик с очень простым запросом - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть служба, которая вставляет и обновляет строки из таблицы.

Проблема начинается, когда кто-то одновременно запускает 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 = ?

НЕТ двух строк с одинаковым идентификатором, поэтому я не понимаю, как возможно возникновение блокировки.

Я использую операторы:

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. Я могу предоставить любую дополнительную информацию, которая может помочь.

1 Ответ

0 голосов
/ 11 ноября 2019

Решением было индексировать столбцы в предложении where.

Похоже, что запрос блокировал все строки, тогда как SCANNING вместо SEEKING конкретной строки.

...