S-JIS[2023-10-07/2023-12-09]
TsurugiのTsubakuro(Java通信ライブラリー)のSqlClientのTransactionのメモ。
|
|
TsubakuroのTransactionは、SQLを実行してコミット/ロールバックするクラス。
TransactionはSqlClientから生成する。
Transactionは使い終わったらクローズする必要がある。(コミット/ロールバックせずにクローズすると、ロールバック扱いになる)
import java.util.concurrent.TimeUnit; import com.tsurugidb.sql.proto.SqlRequest.CommitStatus; import com.tsurugidb.sql.proto.SqlRequest.TransactionOption; import com.tsurugidb.sql.proto.SqlRequest.TransactionType; import com.tsurugidb.tsubakuro.sql.Transaction;
// トランザクション開始 var option = TransactionOption.newBuilder().setType(TransactionType.SHORT).build(); try (Transaction transaction = sqlClient.createTransaction(option).await(3, TimeUnit.SECONDS)) { // SQL実行 String sql = "update test set value = value + 1"; transaction.executeStatement(sql).await(3, TimeUnit.SECONDS); // コミット transaction.commit(CommitStatus.STORED).await(10, TimeUnit.SECONDS); // transaction.rollback().await(3, TimeUnit.SECONDS); // ロールバック }
TransactionはSqlClientのcreateTransactionメソッドで生成する。
生成時にトランザクションオプションを指定する。
→TransactionOptionの例
トランザクション内で大量の処理を行ったり、LTXで他のトランザクションの完了待ちになったりすると、コミットに時間がかかることがあるので、コミットのタイムアウト時間は長めにする必要があるかも。
メソッド | 説明 | 例 |
---|---|---|
executeStatement | DDLや更新系SQL(insert/update/delete)を実行する。 →executeStatementの例 |
try (FutureResponse<ExecuteResult> future = transaction.executeStatement(sql)) { |
try (FutureResponse<ExecuteResult> future =
transaction.executeStatement(preparedStatement, parameters)) { |
||
executeQuery | select文を実行する。 →ResultSetからselect結果を取得する方法 |
try (FutureResponse<ResultSet> future = transaction.executeQuery(sql)) { |
try (FutureResponse<ResultSet> future =
transaction.executeQuery(preparedStatement, parameters)) { |
||
commit | トランザクションをコミットする。 | try (FutureResponse<Void> future = transaction.commit()) { |
try (FutureResponse<Void> future = transaction.commit(commitStatus)) { |
||
rollback | トランザクションをロールバックする。 | try (FutureResponse<Void> future = transaction.rollback()) { |
getSqlServiceException | Tsurugiサーバー側でトランザクションがinactive(続行不能なエラー状態)になっているとき、その原因となったエラーを取得する。 | try (FutureResponse<SqlServiceException> future = transaction.getSqlServiceException()) { |
getTransactionId | Tsurugiサーバー側で採番されたトランザクションIDを取得する。 | String transactionId = transaction.getTransactionId(); |
setCloseTimeout | クローズのタイムアウト時間を設定する。 | transaction.setCloseTimeout(3,
TimeUnit.SECONDS); |
close | Transactionをクローズする。 |
commit・rollbackメソッドの戻り型はFutureResponse<Void>である。すなわち取得する値は無い。(Voidなので)
しかしFutureResponseからgetして、例外が出ないことを確認する必要がある。
(トランザクションがシリアライゼーションエラーになると、これらのメソッドからシリアライゼーションエラーの例外(CcException)が発生する為)
executeStatementメソッドでDDLや更新系SQLを実行する。[2023-12-09]
executeStatementメソッドの戻り型は、Tsubakuro 1.0.1ではFutureResponse<Void>だったが、1.1.0(Tsurugi 1.0.0-BETA2)でFutureResponse<ExecuteResult>に変更になった。
import java.util.Map; import java.util.concurrent.TimeUnit; import com.tsurugidb.tsubakuro.sql.CounterType; import com.tsurugidb.tsubakuro.sql.ExecuteResult;
ExecuteResult result = transaction.executeStatement(sql).await(3, TimeUnit.SECONDS); Map<CounterType, Long> counterMap = result.getCounters(); System.out.println(counterMap); long count = counterMap.values().stream().mapToLong(Long::longValue).sum(); System.out.println(count);
ExecuteResultからは、getCountersメソッドで処理件数を取得することが出来る。
これはCounterTypeをキーとするMapで、CounterTypeは処理の種類を表す。INSERTED_ROWSやUPDATED_ROWS・MERGED_ROWS等。
(MERGED_ROWSは、upsert(insert
or replace)の件数)
createやdropの場合は、空のMapが返る。