-3

次の 2 つのトランザクションを同時に実行しようとするとします。

T1:
BEGIN
  UPDATE place
  SET state_code=5
  WHERE state_code=6
  AND type='town'
COMMIT

T2:
BEGIN
  UPDATE place
  SET state_code=6
  WHERE state_code=5
  AND type='town'
COMMIT

Postgres 9.0 では、トランザクションは正常に完了します。ただし、SQLServer 2005 T1 で実行すると中止されるため、すべての状態が state_code=5 になります。

  1. 厳密なトランザクションのシリアライゼーションに従った/従わなかった DBMS はどれですか? その理由は?
  2. この動作を引き起こすために、各 DBMS でどのような設定が設定されているか、または設定されていない可能性がありますか?
4

2 に答える 2

2

MS SQL はトランザクション ステートメントを次のように使用します。

BEGIN transaction
  UPDATE place
  SET state_code=5
  WHERE state_code=6
  AND type='town'
COMMIT
于 2012-11-12T14:26:36.220 に答える
1

PostgreSQL では、テーブル レベルのロックを使用してこれをテストし、競合するトランザクションが同時に実行されることを確認できます。設定:

CREATE TABLE place (id serial primary key, state_code integer, type text);
INSERT INTO place (state_code, type) VALUES (5, 'town'), (6, 'town');

次に、セッション T0 で:

BEGIN; LOCK TABLE place;

2 つの新しいセッションで、T1 と T2 のコマンドを発行します。

T0 号に戻ります。

ROLLBACK;

テーブルレベルのロックを解放し、T1 と T2 が競合できるようにします。

分離した場合(READ COMMITTEDデフォルト) は両方とも転置されますが、現実の世界では、これはトランザクションの正確な順序に依存し、信頼することはできません。

REPEATABLE READ(PostgreSQL 9.0 では分離と呼ばれる)では、それらは両方とも転置されますが、単一ステートメントのトランザクションでは両方が本質的に同等であるためSERIALIZABLE、 と同じ注意事項があります。READ COMMITTEDスナップショットは、最初のステートメントが実行されたときに取得されますBEGIN。.

SERIALIZABLE単独で、GUC または を介し​​て設定するdefault_transaction_isolationBEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE、一方のトランザクションはシリアライゼーションの失敗でコミットに失敗し、もう一方は成功し、どのトランザクションが勝ったかに応じて、すべての行がstate_code5 になるか、すべての行が6 になります。state_code

SQL Server もトランザクションの 1 つを中止する場合、適切なシリアル化を行っています。

SQL Server は適切なシリアル化に従いました (厳密なシリアル化が要求された場合の現在のバージョンの PostgreSQL と同様)。一方、テスト済みのバージョンの PostgreSQL はREAD COMMITTED分離 (シリアル化が想定されていない) または 9.1 より前のSERIALIZABLE分離 (これはこの異常を検出できませんでした)、厳密なトランザクションのシリアライゼーションのセマンティクスには従いませんでした。

default_transaction_isolationが以外に設定されている場合、これは PostgreSQL 9.2 で発生する可能性があり、SERIALIZABLEPostgreSQL 9.1 より前の標準でした。

SQL Server が使用しているようSET TRANSACTION ISOLATION LEVELです。PostgreSQL では、default_transaction_isolationGUCまたはSET TRANSACTION ISOLATION LEVEL. SQL Server で既定のトランザクション分離レベルをグローバルに設定できるかどうかは不明です。

于 2012-11-13T00:38:03.463 に答える