S-JIS[2023-10-07/2023-12-09]

Tsubakuro Transaction

TsurugiTsubakuro(Java通信ライブラリー)のSqlClientのTransactionのメモ。


概要

TsubakuroのTransactionは、SQLを実行してコミット/ロールバックするクラス。

TransactionはSqlClientから生成する。
Transactionは使い終わったらクローズする必要がある。(コミット/ロールバックせずにクローズすると、ロールバック扱いになる)


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で他のトランザクションの完了待ちになったりすると、コミットに時間がかかることがあるので、コミットのタイムアウト時間は長めにする必要があるかも。


Transactionのメソッド

メソッド 説明
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

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が返る。


SqlClientへ戻る / Tsubakuroへ戻る / Tsurugiへ戻る / 技術メモへ戻る
メールの送信先:ひしだま