ひしだまの変更履歴

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

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開始以前のデータを読む
    • 他トランザクションと競合しない

Tsurugiのトランザクション分離レベルはSERIALIZABLE

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

Tsurugi Advent Calendar 2023の8日目です。

Tsurugiのトランザクション分離レベルはSERIALIZABLEです。
他のRDBMSではトランザクション分離レベルが変更できるものもありますが、TsurugiはSERIALIZABLEのみです。
また、他のRDBMSではsnapshot isolationのことをSERIALIZABLEと言っているものもあるようですが、Tsurugiは真のSERIALIZABLE、だそうです。

SERIALIZABLEは、2つのトランザクションT1とT2を並列に実行したときに、T1→T2またはT2→T1の順に実行した結果のいずれかと同じ結果になる、というものです。
実行したトランザクションがこの条件を満たせない場合(トランザクションの処理内容が他のトランザクションと競合した場合)、SQL実行時やコミット時にシリアライゼーションエラーとなります。
このためTsurugiでは、selectのみのトランザクションであっても、必ず最後にコミットして、コミットが成功すること(シリアライゼーションエラーにならないこと)を確認しなければなりません。

シリアライゼーションエラーが発生した場合は、アプリケーション側でそのトランザクションを先頭から再実行する必要があります。
(再実行することによって、SERIALIZABLEの条件が満たされてトランザクションが成功する想定です(場合によっては、何度も再実行する必要があるかもしれません^^;))


Tsurugiの認証方法

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

Tsurugi Advent Calendar 2023の7日目です。

普通のDBでは、接続する際にユーザーIDやパスワード等を入力して認証を行います。

しかし現在のTsurugiでは、認証は実装されていません。何を指定しても接続できます。

ユーザーIDやパスワードを入力する仕組みは用意されていますが、実質的には使われません。
また、ユーザーIDやパスワードを登録する仕組みもまだありません。