データベーストランザクション独立性レベルテスト-postgresql

7336 ワード

1.read-committed(defaultレベル)


クライアントA:epmdb=>start transaction;START TRANSACTION epmdb=> update t1.dbversion  set  value =1200  where dbversionid=1; UPDATE 1 epmdb=> 
クライアントB:epmdb=>start transaction epmdb->START TRANSACTION epmdb=> select * from t1.dbversion ; dbversionid|value|currentdataversion|targetdataversion-------+-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------dbversion ; dbversionid|value|currentdataversion|targetdataversion---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------COMMIT
Bクエリ:epmdb=>select*from t 1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |  1200 |                100 |                 1 (1 row)

2.read-uncommited(Postgresqlはサポートされていません)


独立性レベルの変更:変更後にデータベースに再接続する必要があります.そうしないと、レベルは変更されません.再接続もできません.A Bのトランザクション独立性レベルを個別に変更するか、デフォルトのトランザクション独立性レベルを変更する必要があります.
 
設定の問題ではありません.docを参照するとpostgresqはこのレベルをサポートしません.
epmdb=> start transaction ; START TRANSACTION epmdb=>  set default_transaction_isolation='read uncommitted'; SET epmdb=> commit; COMMIT epmdb=> show default_transaction_isolation;  default_transaction_isolation  -------------------------------  read uncommitted (1 row)
epmdb=>  set default_transaction_isolation='read uncommitted'; SET epmdb=> show default_transaction_isolation;  default_transaction_isolation  -------------------------------  read uncommitted (1 row)
トランザクションを開き、現在のデータを問い合せます.
epmdb=> start transaction ; START TRANSACTION epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |  1200 |                100 |                 1 (1 row) epmdb=> 

3. repeatable-read


epmdb=> set default_transaction_isolation TO  'repeatable read' ; SET epmdb=> show default_transaction_isolation ;  default_transaction_isolation  -------------------------------  repeatable read (1 row)
Aデータを修正しcommit、
epmdb=> start transaction ; START TRANSACTION epmdb=> update t1.dbversion  set  value =66  where dbversionid=1; UPDATE 1 epmdb=> commit; COMMIT
epmdb=> start TRANSACTION ; START TRANSACTION epmdb=> select * from t1.dbversion ; dbversionid|value|currentdataversion|targetdataversion-------+----------------------------+-------------------------------------------------------------------------1|99|100|1(1 row)BはA修正後、提出後に照会し、データは修正されていない:
epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    99 |                100 |                 1 (1 row) epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    99 |                100 |                 1 (1 row) epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    99 |                100 |                 1 (1 row)
B取引を提出し、再度照会する:
epmdb=> commit; COMMIT epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    66 |                100 |                 1 (1 row)
トランザクションの進行中、他のトランザクションのコミットは現在のトランザクションに影響しません.

4. serialable


epmdb=> show default_transaction_isolation ;  default_transaction_isolation  -------------------------------  serializable (1 row)
独立性レベルを変更するには、トランザクションを開いてから変更してコミットする必要があります.直接setは有効ではありません.
B取引を開き、照会する:
epmdb=> start transaction ; START TRANSACTION epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    66 |                100 |                 1            2 |     3 |                  4 |                50 (2 rows) epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    66 |                100 |                 1            2 |     3 |                  4 |                50 (2 rows)
Aトランザクションをオープンし、変更または挿入しようとします.
epmdb=> start  transaction ; START TRANSACTION epmdb=> select * from t1.dbversion ;  dbversionid | value | currentdataversion | targetdataversion  -------------+-------+--------------------+-------------------            1 |    66 |                100 |                 1            2 |     3 |                  4 |                50 (2 rows) START TRANSACTION epmdb=> update t1.dbversion  set  value =644446  where dbversionid=1; UPDATE 1 epmdb=> insert into t1.dbversion (dbversionid,value,currentdataversion,targetdataversion) values(12444,3,4,50); INSERT 0 1 epmdb=> commit; COMMIT   
すべて成功して、ドキュメントを照会して、serialがトランザクションを並列に提出して、シリアル実行に変換することを知っています
Suppose that serializable transaction A computes:
SELECT SUM(value) FROM mytab WHERE class = 1;

and then inserts the result (30) as the value in a new row with class = 2. Concurrently, serializable transaction B computes:
SELECT SUM(value) FROM mytab WHERE class = 2;

and obtains the result 300, which it inserts in a new row with class = 1. Then both transactions try to commit. If either transaction were running at the Repeatable Read isolation level, both would be allowed to commit; but since there is no serial order of execution consistent with the result, using Serializable transactions will allow one transaction to commit and will roll the other back with this message:
ERROR:  could not serialize access due to read/write dependencies among transactions
は、2つのクエリーを同時にコミットするテストができないため、テストできません.