3

読み取りコミットモード(postgres)で次のトランザクションを実行したいとします。

T1: r(A) -> w(A)
T2: r(A) -> w(A)

操作がこの順序で呼び出された場合:

r1(A)->r2(A)->w1(A)->c1->w2(A)->c2

T2はr(A)で待機する必要があると思います。T1は、後で書き込みたいため、最初の読み取り時にAの排他ロックを設定するためです。しかし、MVCCには読み取りロックはありませんか?

今私は2つの質問があります:

JDBCを使用してデータを読み取り、読み取ったデータを挿入するためにseparteコマンドを実行した場合。データベースは、読み取りのみのときに排他ロックを作成する必要があることをどのように認識しますか?私の知る限り、2PLでは読み取りロックを書き込みロックに増やすことは許可されていません。

私の仮定は間違っていると思います...このシナリオはどこで待機しますか、それとも1つのトランザクションが強制終了されますか?コミットされていない読み取りは、失われた更新を許可するべきではありませんが、これがどのように機能するかはわかりません。

誰かが私を助けてくれたら嬉しいです。ありがとう

4

3 に答える 3

1

「しかし、MVCCには読み取りロックはありませんか?」

MVCCは別の獣です。MVCCには「ロック」はありません。そのシナリオでは、システムは、同時に実行されているトランザクションに必要な数のバージョンの単一行を維持するためです。行の「以前のコンテンツ」は「更新によって失われる」(つまり、物理的に上書きされて破棄される)ことはないため、読者が「新しい更新」を確認できないようにするために、読者からの問い合わせを「リダイレクト」することで対処します。ロックされていない「以前のコンテンツ」(したがって「スナップショットアイソレーション」という用語)。原則として、MVCCはトランザクションの更新には適用できないことに注意してください。

「JDBCを使用してデータを読み取り、読み取りデータを挿入するための別のコマンドを実行した場合。データベースは、読み取りのみのときに排他ロックを作成する必要があることをどのように認識しますか?読み取りロックを書き込みロックに増やすことはできません。私の知る限り、2PLで許可されています。」

あなたは2PLについて間違っています。2PLは、取得したロックがコミット時まで解放されないことを意味します。既存のロックを強化できないという意味ではありません。ちなみに、「カーソルの安定性」などの分離レベルが2PLではないのはそのためです。コミット時間の前に読み取りロックを解放します。

于 2011-05-21T11:15:37.020 に答える
0

T2はr(A)で待機する必要があると思います。T1は、後で書き込みたいため、最初の読み取り時にAの排他ロックを設定するためです。しかし、MVCCには読み取りロックはありませんか?

for updateselectステートメントで指定すると、書き込みロックがあります。その場合、r2(A)は、r1(A)と同じ行をロックしようとすると、読み取りを待機します。

http://www.postgresql.org/docs/9.0/interactive/explicit-locking.html

デッドロックは、2つのトランザクションが開始し、すでにロックされている行を相互に要求する場合に発生します。

r11(A) -> r22(A) -> r12(A) (same as r22) vs r21(A) (same as r11) -> deadlock
于 2011-05-20T18:31:41.023 に答える
0

PostgreSQLのデフォルトのトランザクションモードはREADCOMMITTEDですが、READ COMMITTEDは、探しているシリアル化のレベルを提供しません。

SERIALIZABLEトランザクションレベルを探しています。トランザクションのシリアル化レベル、特にSERIALIZABLEモードに関するPostgreSQLのドキュメントを読んだ後、SETTRANSACTIONコマンドを確認してください。PostgreSQLのMVCCドキュメントも読む価値があります。

乾杯。

于 2011-05-20T17:51:50.113 に答える