トランザクションの同時発生を回避するにはどうすればいいですか?

1953 ワード

 
v ,x


                                              
                          
    1、READ UNCOMMITTED     √            √               √
    
    2、READ COMMITTED       x             √               √
    
    3、REPEATABLE READ      x            x               √                  
    
    4、SERIALIZABLE( ) x            x            x

 
詳細:
Read uncommitted
Aトランザクションは、コミットされていないトランザクションBのデータを読み出すことができる
発生する問題:
汚い読み:B事物修正データa=1、しかし提出していない、A事物読取データa=1、A事物がデータを手に入れた後に表示して、この時B事物はロールバックして、再びデータa=2を修正して、それから提出して、だから実際のデータa=2、しかしA事物が手に入れたのはa=1です.
 
Read committed
Aトランザクションは、Bトランザクションがコミットされてからデータを読み込む必要があります.
発生する問題:
繰り返して読むことができない:A事物はa=1を読み取って、A事物は再びaを読み取って、この時B事物はa=2を修正して、A事物はBが提出するのを待ってaを読み取って、この時a=2、1つの事務範囲内の2つの同じクエリーは異なるデータを返しました.
 
Repeatable read
繰り返し読みとは、A事象がデータの読み取りを開始したとき(トランザクションがオン)、B事象が修正操作を許可されないこと(修正対応はUPDATE操作)
A事物がデータa=1を読み取る場合、B事物はデータaの修正を許されず、A事物が実行するまで、B事物は修正データaを実行することができる.
発生する問題:
幻読:A事物は表全体の総金額aを読み取るが、Repeatable readはupdate操作に対応するため、insertの新しいデータの場合、2つの事物が同時に行うことができ、これによりA事物が再照会する際、データaが変化する.
 
Serializableシーケンス化
Serializableは最も高いトランザクション独立性レベルであり、このレベルではトランザクションがシリアル化されて順次実行され、汚れた読み取り、重複しない読み取り、幻の読み取りを回避できます.しかし、このトランザクション・独立性レベルは効率が低下し、データベースのパフォーマンスが消費され、一般的には使用されません.
 
 
ほとんどのデータベースのデフォルトのトランザクション独立性レベルは、Sqlサーバ、OracleなどのRead committedです.
Mysqlのデフォルトの独立性レベルはRepeatable readです.
 
参照先:
https://www.cnblogs.com/ubuntu1/p/8999403.html
 
転載先:https://www.cnblogs.com/sea-stream/p/11297934.html