トランザクションを途中で中止する方法はありますか?たとえば、5分後に実行されるコマンドをデータベースに送信し、4分後にそれを中止したいとします。
JDBCは、「この接続で行っていることをすべて停止する」信号をDBに送信する方法を定義していますか?
Jamesが述べたように、 Statement.cancel() は、実行中のステートメント(select、updateなど)の実行をキャンセルします。 JDBCのドキュメントでは、Statement.cancel()は別のスレッドから安全に実行できると具体的に述べており、タイムアウトスレッドで呼び出す方法も提案されています。
ステートメントをキャンセルした後も、トランザクションをロールバックする作業はまだ続きます。つまり、notは、別のスレッドから安全に実行できると文書化されています。 Connection.rollback() は、他のすべてのJDBC呼び出しを実行するメインスレッドで発生する必要があります。キャンセルされたStatement.execute ...()呼び出しがJDBCExceptionで完了した後(キャンセルのため)、これを処理できます。
私はあなたがしたいことは、長時間実行されているクエリ/トランザクションでアプリケーションがブロックされないようにすることだと思います。この目的のために、JDBCはクエリタイムアウトの概念をサポートしています。これを使用してクエリタイムアウトを設定できます。
_Java.sql.Statement.setQueryTimeout(seconds)
_
そして、トランザクションをロールバックすることにより、execute()
メソッドによってスローされたSQLException
を処理します(もちろん、autocommitがfalseに設定されていて、JDBCドライバーがStatement.cancel( ))。
Statement.cancel()を確認してください。