web-dev-qa-db-ja.com

トランザクションの連鎖と自動コミットの関係

トランザクション連鎖autocommitの概念間の関係を理解し​​ようとしています。 Autocommitは通常、クライアント側のプログラムインターフェイスで公開されます。例えば。 JDBCで Connection#setAutoCommit メソッドを使用します。

つまり、私は次のことを知りたいです:

  1. これらの概念は単に互いのエイリアスです(そして対応は何ですか)

または

  1. これらの概念は直交しており、4つの組み合わせすべてが意味をなし、さまざまな結果を生み出します(これらの結果は何ですか)

ケースが1であることを示唆する多くのリソースがあります。同じリソースは、unchainedautocommit onに対応することを示唆しているようです。例えば。 この投稿 は次のように述べています:

チェーンをオフに設定(Sybaseのデフォルト、=自動コミットをオンに設定)

このより広範な投稿 同様に言う:

一部のデータベースプログラミングインターフェイスには自動コミットモードがあり、非チェーンモードとも呼ばれます。このモードでは、各ステートメントはトランザクションであり、実行後にコミットされます。アプリケーションでトランザクションを使用する場合は、手動コミットモードまたはチェーンモードを使用する必要があります。

これまでのところ、私自身の理解です。たとえば、ストアドプロシージャを(JDBCを使用して)実行しようとすると、次のメッセージが表示されます。

Java.sql.SQLException:ストアドプロシージャ 'whatever'は、非チェーントランザクションモードでのみ実行できます。

…そして私のコードで設定します:

conn.setAutoCommit(true);

…実際にunchainedautocommitと同じであることを確認するように見える問題を修正します。

ただし、 Sybase ASEのドキュメント を見ると、次のようになります。

非チェーンモードまたはTransact-SQLモードと呼ばれる既定のモードでは、トランザクションを完了するために、コミットトランザクションまたはロールバックトランザクションステートメントと組み合わせた明示的なbegin transactionステートメントが必要です。

これはautocommitの正反対です-上記のテキストが次の意味を持つと理解されない限り:

非連鎖モードまたはTransact-SQLモードと呼ばれるデフォルトモードでは、トランザクションを完了するために、コミットトランザクションまたはロールバックトランザクションステートメントとペアになっている明示的なbegin transactionステートメントが必要です。トランザクション

最後に、私は この投稿 に遭遇しましたchainingautocommitはほとんど直交していることを示唆しています。

AutoCommit trueはチェーンオフと同じです

AutoCommit falseはchained onと同じです

連鎖モードでは、最初のステートメントが暗黙的なトランザクションを開始し、手動でコミットまたはロールバックするまでアクティブのままになります。

マニュアルでは、デフォルトモードはチェーンなしであると記載されていますが、これはクライアントライブラリには当てはまりません。 JDBCおよびPythonドライバは、上書きしない限り、デフォルトのチェーンモードを使用します。

0
Sven Klemm