Как я могу прервать запущенную транзакцию JDBC? - PullRequest
27 голосов
/ 17 ноября 2008

Есть ли способ преждевременно прервать транзакцию? Скажем, я отправил команду в базу данных, которая выполняется пять минут, а после четырех я хочу прервать ее.

Определяет ли JDBC способ отправки в базу данных сигнала «остановите все, что вы делаете с этим соединением»?

Ответы [ 4 ]

32 голосов
/ 17 ноября 2008

Как упомянуто james, Statement.cancel () отменит выполнение запущенного оператора (выбор, обновление и т. Д.). В документах JDBC определенно сказано, что Statement.cancel () безопасно запускать из другого потока, и даже предлагается использовать его вызов в потоке времени ожидания.

После отмены выписки вы все еще застряли на работе по откату транзакции. То есть не задокументировано как безопасное выполнение из другого потока. Connection.rollback () должен происходить в основном потоке, выполняя все другие вызовы JDBC. Вы можете справиться с этим после того, как отмененный вызов Statement.execute ... () завершится с JDBCException (из-за отмены).

14 голосов
/ 17 ноября 2008

Я предполагаю, что вы хотите предотвратить блокировку вашего приложения при длительных запросах / транзакциях. С этой целью JDBC поддерживает концепцию тайм-аута запроса. Вы можете установить тайм-аут запроса, используя это:

java.sql.Statement.setQueryTimeout(seconds)

И обработать SQLException, выброшенный методом execute(), откатив транзакцию (конечно, это будет работать, только если для autocommit установлено значение false, а драйвер JDBC поддерживает Statement.cancel ()).

5 голосов
/ 17 ноября 2008

Проверьте Statement.cancel ().

0 голосов
/ 17 ноября 2008

Нет, вы не можете прервать его, используя стандартный JDBC.

Вы можете попытаться проверить, определяет ли ваша конкретная СУБД какое-либо расширение для поддержки этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...