S-JIS[2023-10-07/2023-12-09]
TsurugiのTsubakuro/Java(Java通信ライブラリー)のSqlClientのTransactionのメモ。
		
  | 
		|
Tsubakuro/Javaの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が返る。