85605


トランザクションの並行処理だと整合性が取れなくなる問題を検証したいがために  
Aセッションでは金額1000円に1000円をたして2000円にupdateして、  
そのあとに、Bセッションでは金額1000円に5000円たしてみて整合性が取れないのを確認をしようと思っています。

私の予想だとBセッションの6000円になればよかったのですが、Bセッションのupdateの時にwaitになりAセッションBセッションが正しく動き7000円になってしまいます。  
それならトランザクションだけでよいのではと思ってしまいました。  
トランザクションの行ロックが必須と思っていたのですが・・・


CC BY-SA 4.0
2022-01-10T07:52:10.390
85599
2022-01-10T10:30:19.167
20350
question
sql postgresql
トランザクションについて


おそらく、デフォルトの Read Committed の分離レベルでトランザクションを実行したのだと思っています。

<https://www.postgresql.jp/document/13/html/transaction-iso.html#XACT-READ-
COMMITTED>

こちらにある通り、 Read Committed 時の Update の挙動は以下の通りです。

  1. 対象となる行を、 update クエリ開始時点の database snapshot から探す
  2. それぞれの行について、以下を行う。  
a. その行が他のトランザクションによって変更されていなければ、そのまま update する。  
b. その行が他のトランザクションにより変更されている場合、 commit か rollback するのを待ち、 rollback の場合はそのまま
update, commit の場合は、それによって今実行している update の where
条件の対象外になっていないかどうかを判定し、未だ対象内ならば update. 対象外ならば update しない

この挙動により、上記の資料からの抜粋になりますが、以下のように update
分を、元の値を利用する形で記述している場合、これは意図通りの結果になる、とのことです。

[code]

    BEGIN;
    UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
    UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
    COMMIT;
    
[/code]


CC BY-SA 4.0
2022-01-10T10:30:19.167
85605
2022-01-10T10:30:19.167
754
85599
answer