web-dev-qa-db-ja.com

Verticaでは、ロールバックできない場合にトランザクションを開始できるのはなぜですか?

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のいずれかを実行しようとしたことを知っていました。

まだできません!私の接続は自動コミットモードなので、ROLLBACKCOMMITは何も意味しません。私のUPDATEは完了時にコミットされました。

私は何かを見逃しましたか、それともこれはVertica側の非常に悪い実装だと思って間違いありませんか?

論理的な結果(ROLLBACKまたはCOMMIT)が不正である場合、Verticaは自動コミットモードの接続でBEGIN TRANSACTIONを受け入れるのはなぜですか?

2
Nick Chammas

Verticaサポートはこの問題を認識しており、VER-44735で修正を追跡しています。 Verticaの課題追跡は、残念ながら一般には公開されていません。

Verticaはこれをバグとして特徴付けることを拒否し、代わりに「新機能リクエスト」としてラベルを付けましたが、これに関係なく、次のリリースで対処する必要があります。

1
Nick Chammas

Vertica(実際には、すべてではないにしてもほとんどのデータベースだと思います)は、BEGIN TRANSACTION SQLステートメントを処理する部分、つまりクエリの解析と実行エンジンがクライアントのAUTOCOMMIT設定を認識しないため、このように動作します。一方、クライアントは文字列「BEGIN TRANSACTION」の意味を認識していません。

制御の流れは次のようになります。例を実行するためにコマンドラインクライアントvsqlが使用されていると想定します。

  1. ユーザーがvsqlを起動してデータベースに接続します。
  2. ユーザーが\set AUTOCOMMIT onを入力します。その後、クライアント(vsql)は、成功した各ステートメントの後に暗黙のCOMMITステートメントを発行することを知っています。
  3. ユーザーはBEGIN TRANSACTIONを入力します。 vsqlは、その文字列を内部コマンドの1つとして認識せず、文字列をサーバーに送信して処理します。
  4. サーバーは文字列を有効なSQLステートメントとして認識し、それをコンパイルしてトランザクションを開始し、成功した結果コードをクライアントに返します。自動コミットはクライアント側の設定であるため、サーバーはそれを認識していません。
  5. クライアントは、成功した結果コードを受け取ると、サーバーにCOMMITを発行します。
  6. サーバーは、開始したばかりのトランザクションに準拠してコミットします。

等.

1
mustaccio