goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Tsurugi 1.0.0-BETA2の構成定義ファイルの変更点

2023-12-14 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の14日目です。

2023/12/7にリリースされたTsurugi 1.0.0-BETA2では、構成定義ファイルの設定のデフォルト値が一部変更になりました。

  • commit_response
    • コミットオプションを付けずにコミットした場合の挙動の設定が、AVAILABLEからSTOREDに変わりました。
    • もう少し詳しく言うと、BETA1でもcommit_responseを書かない場合はSTOREDでしたが、デフォルトの構成定義ファイルにはAVAILABLEが指定されていました。
    • AVAILABLEとSTOREDの違いは、永続化前と永続化後です。永続化すると(すなわちファイルに永続化データを書くので)その分コミットの処理時間が遅くなりますが、データの保存は確実になります。
  • epoch_duration
    • エポック間隔は、DB内部でコミット処理を行う間隔の時間です。
    • デフォルトが40ミリ秒だったのが3ミリ秒に変更されました。
    • ちなみにepoch_durationの単位は「マイクロ秒」なので、3ミリ秒は3000です。
      (間違って3を指定したら…(爆))

Tsurugi 1.0.0-BETA1とBETA2の通信の互換性

2023-12-13 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の13日目です。

2023/12/7に、Tsurugi 1.0.0-BETA2がリリースされました。→リリースノート

BETA1とBETA2では、Tsurugiサーバーとクライアント(Tsubakuro)間の通信データの一部に互換性の無い変更が加わっています。
このため、Tsurugiサーバーとクライアントのバージョンが合っていないと、エラーが発生することがあります。
Tsurugi SQLクライアント(tgsql)IceaxeはTsubakuroを使用している為、同じ影響を受けます。

クライアントとTsurugiサーバーのバージョンが同じ場合(○)

クライアントとTsurugiサーバーのバージョンが同じ場合は、当然ながら正しく通信できます。

tgsql> insert into test values(1,1,'1');
(1 row inserted)

※tgsql 1.1.0(Tsurugi 1.0.0-BETA2)では、更新系SQLの処理件数が表示されるようになりました

クライアントが古く、Tsurugiサーバーが新しい場合(×)

Tsubakuroが1.0.1(Tsurugi 1.0.0-BETA1)、Tsurugiサーバーが1.0.0-BETA2の場合、SQL実行でエラーが発生します。

tgsql> insert into test values(1,1,'1');
com.tsurugidb.tsubakuro.exception.CoreServiceException: SCD-00501: inconsistent service message version: see https://github.com/project-tsurugi/tsurugidb/blob/master/docs/service-message-compatibilities.md (client: "sql-0.0", server: "sql-1.0")

「service message version」というのが通信データのバージョンのことで、そのエラーメッセージに書かれている通り、service-message-compatibilities.mdに対応バージョンが書かれています。

クライアントが新しく、Tsurugiサーバーが古い場合(△)

Tsubakuroが1.1.0(Tsurugi 1.0.0-BETA2)、Tsurugiサーバーが1.0.0-BETA1の場合、SQLを実行することは出来ます。
ただし、更新系SQLの処理件数が返ってきません。

tgsql> insert into test values(1,1,'1');
execute succeeded

Iceaxeの場合、更新系SQLを実行するexecuteAndGetCountメソッドは、1.0.1では常に-1を返していましたが、1.1.0ではTsurugiサーバーから返された更新件数を返します。しかしTsurugiサーバーがBETA1だと更新件数を返さないため、executeAndGetCountメソッドは0を返すことになります。


Tsurugiのトランザクション内でエラーが発生した場合の挙動

2023-12-12 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の12日目です。

現在のTsurugiでは、トランザクション内でSQLを実行してエラーが発生した場合、そのトランザクションは使用不可になります。
エラー発生後に続けてSQLを実行したりコミットしたりすると、INACTIVE_TRANSACTION_EXCEPTIONが発生します。

Tsurugi SQLコンソール(tgsql)の場合、\show transactionでトランザクションの状態が確認できます。
トランザクションの使用が続行不可能な場合は「transaction status: cannot continue」というメッセージと共に、エラー原因のメッセージが表示されます。

Iceaxeの場合は、TsurugiTransactionのgetTransactionStatusメソッドでトランザクションの状態を取得できます。
Tsubakuroの場合は、TransactionのgetSqlServiceExceptionメソッドで、発生したエラーを取得できます。


TsurugiのDDL

2023-12-10 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の10日目です。

Tsurugiでは、DDLもトランザクションの中で実行します
ただしトランザクション管理外なので、createやdropが成功した時点で(コミットしなくても)テーブルが作成・削除されますし、ロールバックしても元には戻りません。

なお、DDLのトランザクションもシリアライゼーションエラーになることがあるらしいです。
(システム内部で使っているテーブルが競合した場合だとか)
なので、DDLは並列に実行しない方がいいでしょう。(普通はしないと思いますが^^;)

それと、DDLとDMLを同一のトランザクションで実行することも非推奨です。
createとinsertを同一のトランザクションで実行することはよくあると思いますが…。(実際に試してみると、createとinsertを同じトランザクションで実行することは可能なようですが、何か不具合が起きることがあるのかもしれません)

DDLとDMLを別トランザクションで同時に実行するのもやめた方がいいです。(普通はしないと思いますが^^;)
特に、DMLで操作中のテーブルをdropすると、DBがクラッシュすることがあります。

こういった制限は、現時点のTsurugi 1.0.0-BETA1の制限なので、将来的には緩和されるのではないかと思いますが…。


Tsurugiのトランザクション種別

2023-12-09 00:00:00 | PG(RDBMS)

Tsurugi Advent Calendar 2023の9日目です。

Tsurugiでは、トランザクション開始時にトランザクションオプションを指定します。中でもトランザクション種別は必須です。

指定できるトランザクション種別は、OCC・LTX・RTXの3種類です。これらの説明は、Tsurugiの書籍のp.179やp.185に載っています。(そこはIceaxe(Javaライブラリー)の章なので、Javaに興味が無い人は読み飛ばすかもしれませんが、Java以外でも必要な事項が載っていたりします^^;)

  • OCC
    • 実行時間が短いトランザクション(いわゆるオンライン処理向け)
    • SQL実行時点でコミットされている最新データを読む(READ COMMITTEDと同様)
    • LTXと競合すると、基本的にOCCがシリアライゼーションエラーになる
    • 他のOCCと競合すると、先にコミットした方が優先で、後からコミットした方がシリアライゼーションエラーになる
  • LTX
    • 実行時間が長いトランザクション(いわゆるバッチ処理向け)
    • LTX開始時点のデータを読む
    • 他のLTXと競合すると、先に始まった方が優先される。一番最初に始まったLTXは、シリアライゼーションエラーにならない
  • RTX
    • 読み取り専用トランザクション(selectしか実行できない)
    • RTX開始以前のデータを読む
    • 他トランザクションと競合しない