Verticaデータベースに対して次のステートメントを1つずつ実行します。
BEGIN TRANSACTION;
UPDATE table
SET col1 = 'something'
WHERE col2 = 'something else';
SELECT COUNT(*)
FROM table
WHERE col1 = 'something';
ROLLBACK TRANSACTION;
私は最初の行を正常に実行します... OK、今トランザクションにいます。
アップデートを実行します... OK、うまくいきました。
SELECT
テストを実行して、期待どおりに機能することを確認します...あら、WHERE
ステートメントのUPDATE
句の条件を逃したようです。
心配ない!これが、トランザクションでこれを実行した理由です。
ロールバックしましょう:
=> ROLLBACK TRANSACTION;
[Vertica][JDBC](10040) Cannot use commit while Connection is in auto-commit mode.
ジョーンズ、あなたの机の上にあるトイレットペーパーのロールを手渡してください。
そのため、Verticaは私のBEGIN TRANSACTION
を喜んで受け入れ、その直後にROLLBACK
またはCOMMIT
のいずれかを実行しようとしたことを知っていました。
まだできません!私の接続は自動コミットモードなので、ROLLBACK
とCOMMIT
は何も意味しません。私のUPDATE
は完了時にコミットされました。
私は何かを見逃しましたか、それともこれはVertica側の非常に悪い実装だと思って間違いありませんか?
論理的な結果(ROLLBACK
またはCOMMIT
)が不正である場合、Verticaは自動コミットモードの接続でBEGIN TRANSACTION
を受け入れるのはなぜですか?
Verticaサポートはこの問題を認識しており、VER-44735で修正を追跡しています。 Verticaの課題追跡は、残念ながら一般には公開されていません。
Verticaはこれをバグとして特徴付けることを拒否し、代わりに「新機能リクエスト」としてラベルを付けましたが、これに関係なく、次のリリースで対処する必要があります。
Vertica(実際には、すべてではないにしてもほとんどのデータベースだと思います)は、BEGIN TRANSACTION
SQLステートメントを処理する部分、つまりクエリの解析と実行エンジンがクライアントのAUTOCOMMIT設定を認識しないため、このように動作します。一方、クライアントは文字列「BEGIN TRANSACTION」の意味を認識していません。
制御の流れは次のようになります。例を実行するためにコマンドラインクライアントvsql
が使用されていると想定します。
vsql
を起動してデータベースに接続します。\set AUTOCOMMIT on
を入力します。その後、クライアント(vsql
)は、成功した各ステートメントの後に暗黙のCOMMIT
ステートメントを発行することを知っています。BEGIN TRANSACTION
を入力します。 vsql
は、その文字列を内部コマンドの1つとして認識せず、文字列をサーバーに送信して処理します。COMMIT
を発行します。等.