Как я могу прервать транзакцию JDBC?
Есть ли способ преждевременно прервать транзакцию? Скажем, я отправил команду в базу данных, которая длится пять минут и после четырех, я хочу прервать ее.
Определяет ли JDBC способ отправки сигнала "остановить все, что вы делаете по этому соединению" в БД?
Ответы
Ответ 1
Как упоминалось james, Statement.cancel() отменит выполнение запускающего заявления (select, update и т.д.). В документах JDBC указано, что Statement.cancel() безопасен для запуска из другого потока и даже предлагает использовать вызов в потоке таймаута.
После отмены заявления вы все еще придерживаетесь задания по откату транзакции. Это не задокументировано как безопасное для запуска из другого потока. Connection.rollback() должен произойти в основном потоке, выполняющем все другие вызовы JDBC. Вы можете справиться с этим после того, как отмененный запрос Statement.execute...() завершится с помощью JDBCException (из-за отмены).
Ответ 2
Я угадываю, что вы хотите сделать, это не блокировать приложение при длительных запросах/транзакциях. С этой целью JDBC поддерживает концепцию тайм-аута запроса. Вы можете установить таймаут запроса, используя это:
java.sql.Statement.setQueryTimeout(seconds)
И обработайте метод SQLException
, созданный методом execute()
, отбросив транзакцию (конечно, это будет работать, только если у вас установлена автозагрузка false, а ваш драйвер JDBC поддерживает Statement.cancel()).
Ответ 3
Отметьте Statement.cancel().
Ответ 4
Нет, вы не можете прервать его, используя стандартный JDBC.
Вы можете попытаться проверить, определяет ли ваша конкретная СУБД некоторое расширение, чтобы суппотировать его.