如何中止正在运行的 JDBC 事务?

2022-09-01 11:42:48

有没有办法过早地中止交易?假设,我向数据库发送了一个命令,该命令运行五分钟,四分钟后,我想中止它。

JDBC 是否定义了一种向 DB 发送“停止在此连接上执行的任何操作”信号的方法?


答案 1

正如 james 所提到的,Statement.cancel() 将取消正在运行的语句的执行(选择、更新等)。JDBC 文档特别指出,Statement.cancel() 可以从另一个线程运行是安全的,甚至建议在超时线程中调用它。

取消语句后,您仍然会陷入回滚事务的工作。这没有被记录为从另一个线程运行是安全的。Connection.rollback() 应该发生在执行所有其他 JDBC 调用的主线程中。您可以在取消的语句.execute...() 调用以 JDBCException 完成(由于取消)。


答案 2

我猜你想做的是防止你的应用程序阻塞长时间运行的查询/事务。为此,JDBC 支持查询超时的概念。您可以使用以下命令设置查询超时:

java.sql.Statement.setQueryTimeout(seconds)

并通过回滚事务来处理方法抛出的(当然,这只有在自动提交设置为 false 并且 JDBC 驱动程序支持 Statement.cancel()时才有效)。SQLExceptionexecute()


推荐