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