[アップデート] Amazon Aurora PostgreSQL 15.5 がリリースされたので、Babelfish 3.4 のアップデート内容を確認してみた

2024.01.15

いわさです。

先月のアップデートになるのですが、Aurora PostgreSQL で 15.5 が使えるようになりました。

私は Aurora PostgreSQL のエンジンバージョンがアップデートされる度に Babelfish も強化されるのがとても好きでして、いつも「今回は新しく何が出来るようになったのだろう」というのを楽しみにしています。

今回は新しく使えるようになった機能でトランザクション分離レベルの指定可能なオプションが増えたので試してみました。

Aurora PostgreSQL 15.5 を作成し Babelfish のバージョンを確認

Aurora PostgreSQL 15.5 を作成し、Babelfish オプションを有効化します。

余談ですが、以前までは Babelfish が使えるバージョンとか、Aurora Serverless が使えるバージョンのみを表示するためのトグルボタンが表示されていた気がしましたが、消えましたね。

クラスターが作成出来たら、ライターエンドポイントにsqlcmdで接続します。

% psql -h hoge0115aurora-instance-1.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d babelfish_db
Password for user postgres: 
psql (14.9 (Homebrew), server 15.5)
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

babelfish_db=> SELECT aurora_version() AS aurora_version, version() AS postgresql_version, sys.version() AS Babelfish_compatibility, sys.SERVERPROPERTY('BabelfishVersion') AS Babelfish_Version;
 aurora_version |                                       postgresql_version                                        |                           babelfish_compatibility                           | babelfish_version 
----------------+-------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------
 15.5.0         | PostgreSQL 15.5 on x86_64-pc-linux-gnu, compiled by x86_64-pc-linux-gnu-gcc (GCC) 9.5.0, 64-bit | Babelfish for Aurora PostgreSQL with SQL Server Compatibility - 12.0.2000.8+| 3.4.0
                |                                                                                                 | Dec  7 2023 03:17:32                                                       +| 
                |                                                                                                 | Copyright (c) Amazon Web Services                                          +| 
                |                                                                                                 | PostgreSQL 15.5 on x86_64-pc-linux-gnu (Babelfish 3.4.0)                    | 
(1 row)

Babelfish バージョンは 3.4.0 になりましたね。
SQL Server の互換性情報はSQL Server Compatibility - 12.0.2000.8+のままですね。これはずっと変わらないですね。いつか変わる時が来るのだろうか。

Babelfish のアップデート内容

Babelfish のアップデート内容は次の公式ドキュメントから確認が可能です。

今回の Babelfish 3.4 ですが新機能がかなり追加されています。
NOT NULL IDENTITYとか、DBCC CHECKIDENTなどの ID 列関係の機能が解放されてますね。出来なかったんかいという感じかもしれませんが。

そして今回はトランザクション分離レベルでREPEATABLE READSERIALIZABLEがサポートされるようになりました。これでひととおり揃ったのではないでしょうか。

REPEATABLE READ を試してみる

せっかくなのでなにか Babelfish 3.4 の動作確認をしておきたい。ということでREPEATABLE READを使ってみることにしました。

SQL Server のトランザクション分離レベル「REPEATABLE READ」について以下に記載されています。

トランザクションの各ステートメントで読み取ったすべてのデータには共有ロックが設定され、トランザクションが完了するまでその状態が保持されます。 これにより、現在のトランザクションで読み取った行は、他のトランザクションで変更できなくなります。 他のトランザクションでは、現在のトランザクションで実行されているステートメントの検索条件に一致する行を新しく挿入することができます。 その後、現在のトランザクションでステートメントが再試行された場合は新しい行が取得されるので、結果としてファントム読み取りが発生します。

ただし、確認してみたのですがREPEATABLE READSERIALIZABLEも共有ロック周りの挙動は私が確認した際にはうまくいきませんでした。
検証の仕方がまずかったのかもしれない。

デフォルトのままだと使えない

上記のとおりSET TRANSACTION ISOLATION LEVELで設定するのですが、デフォルトだと失敗します。
ドキュメントに記載がなかったですが構成の変更が必要です。

1> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
2> go
Msg 33557097, Level 16, State 1, Server hoge0115aurora-instance-1, Line 1
Isolation level 'REPEATABLE READ' is not currently supported in Babelfish. Set 'babelfishpg_tsql.isolation_level_repeatable_read' config option to 'pg_isolation' to get PG repeatable read isolation level.
2> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
3> go
Msg 33557097, Level 16, State 1, Server hoge0115aurora-instance-1, Line 2
Isolation level 'SERIALIZABLE' is not currently supported in Babelfish. Set 'babelfishpg_tsql.isolation_level_serializable' config option to 'pg_isolation' to get PG serializable isolation level.

で、クラスターパラメータグループで上記を調べてみたのですが存在しませんでした。
パラメータグループのアップデートが追いついていないのか?

今回はset_configを使って設定してみました。

1> select current_setting('babelfishpg_tsql.isolation_level_repeatable_read');
2> go
current_setting                                                                                                                                                                                                                                                 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
off                                                                                                                                                                                                                                                             

(1 rows affected)
1> SELECT set_config('babelfishpg_tsql.isolation_level_repeatable_read','pg_isolation',false)
2> go
set_config                                                                                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pg_isolation                                                                                                                                                                                                                                                    

(1 rows affected)
1> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
2> go

変更出来ましたね。
まずはデフォルトのままでトランザクションを開始してみましょう。デフォルトはREAD COMMITEDのようですね。
トランザクション中に他トランザクションでコミットされた情報を読取ることが出来ました。
ファントムリードというやつですね。

1> BEGIN TRAN
2> go
1> select * from hogetbl;
2> go
fuga        piyo                
----------- --------------------
          1 111                 
          2 222                 
         
(2 rows affected)
1> select * from hogetbl;
2> go
fuga        piyo                
----------- --------------------
          1 111                 
          2 222                 
          3 333                 

(3 rows affected)

次はREPEATABLE READです。
あろうことか、他のトランザクションでの UPDATE と INSERT のコマンドをキャプチャし忘れてしまったためよくわからない検索結果となっていますが、共有ロックがうまくいっていない可能性があります。

1> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
2> go
1> BEGIN TRAN
2> go
1> select * from hogetbl;
2> go
fuga        piyo                
----------- --------------------
          1 111                 
          2 222                 
          3 333                 
          4 444                 

(4 rows affected)
1> select * from hogetbl;
2> go
fuga        piyo                
----------- --------------------
          1 111                 
          2 222                 
          3 333                 
          4 444                 

(4 rows affected)
1> COMMIT TRAN
2> go
1> select * from hogetbl;
2> go
fuga        piyo                
----------- --------------------
          1 111                 
          2 222                 
          3 333                 
          4 444                 
          5 555                 

(5 rows affected)

SERIALIZABLEのロック周りも全然動いていなかったので、なんとなくですが、PostgreSQL の Autocommit に引っ張られている気がします。そのあたりを変更してもう少し検証してみたいと思います。

さいごに

本日は Amazon Aurora PostgreSQL 15.5 がリリースされたので、Babelfish 3.4 のアップデート内容を確認してみました。

今回はトランザクション分離レベルで新たにサポートされたオプションを設定してみましたが、パラメータグループの現状など、ネイティブと同じ使い勝手かというと少しまだ違う感じがしましたね。
ただ、他にも色々と機能が追加されたりと、Babelfish 自体はかなりアップデートされ続けていますし、今後も楽しみです。