Как использовать ROWLOCK с EJB - PullRequest
       16

Как использовать ROWLOCK с EJB

0 голосов
/ 11 августа 2009

У меня проблема с тупиком на MS SQL Server. Тот же код работает без проблем на MySQL.

Моя проблема заключается в том, что я получаю запрос на удаление задания (которое подключено к устройству), а после этого я получаю запрос на создание новой работы для того же устройства. В большинстве случаев это работает без проблем, но время от времени запрос на удаление не завершается, когда я получаю запрос на создание нового задания для устройства, и именно здесь я захожу в тупик.

Приложение работает на JBoss, и я получаю запросы из очереди сообщений.

Я обнаружил, что, возможно, смогу решить проблему на MSSQL с помощью ключевого слова rowlock, но как мне включить это при использовании именованных запросов и одновременной поддержке MySQL?

Или есть какой-нибудь другой способ, которым я мог бы гарантировать, что один запрос завершается перед выполнением следующего запроса для того же устройства?

Трассировка стека с удалением некоторых частей выглядит следующим образом:

2009-08-11 10:03:22,621 WARN  [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1205, SQLState: 40001
2009-08-11 10:03:22,621 ERROR [org.hibernate.util.JDBCExceptionReporter] Transaction (Process ID 200) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
2009-08-11 10:03:22,621 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: could not delete: [dme.dm.device.Task#131]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:82)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
---cut cut cut---
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 200) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
---cut cut cut---

1 Ответ

0 голосов
/ 13 августа 2009

От коллеги я слышал, что он долго пытался заставить MSSQL использовать rowlock вместо pagelock, но безуспешно. Каждый раз, когда ему приходилось обходиться, например, перехватывать исключение и перезапускать запрос.

В моем случае я использую EJB, так что я даже не мог понять, как применять блокировку строк с помощью спящего режима.

То, что проблема заключается в блокировке страницы, - единственное объяснение, которое я могу найти. Нет связи между тем, что удалено, и тем, что вставлено, кроме устройства (которое не тронуто) и используемых таблиц.

Таким образом, решение на данный момент состоит в том, чтобы перехватить исключение и повторно запустить удаление.

...