8.事務の浅い分析
5084 ワード
取引
トランザクションの正しい実行により、データベースがある状態から別の状態に変換されます.
トランザクションのプロパティ(ACID)
A atomicity:成功か失敗か--undo,mvcc C consistency:状態一致,データ整合性制約--開発者に対する要求I isolation:トランザクション間相互隔離,影響できない--lock,undo,mvcc D durability:トランザクションが正しくコミットされ,永続的に保持されなければならない--redo,wal
同時トランザクションの問題
ダーティリード:リードがコミットされていない、データが異なる(update)重複リード不可*:同じトランザクションが異なるデータに読み込まれる幻リード:レコードが異なる(delete/insert)
トランザクション独立性レベル
独立性レベル
汚読
繰り返し不可
まぼろし読み
read uncommit
はい
はい
はい
read commit--pgデフォルト
いいえ
はい
はい
repeatable read
いいえ
いいえ
はい
serialiable
いいえ
いいえ
いいえ
------pgは3種類実現しており、READ UNCOMMITTEDはREAD COMMITTEDと同様
pgにおけるトランザクション制御
MVCC
Multi-Version Concurrency Control:マルチバージョン同時制御pgの実現方法:update/delete既存行を保持し、sertレコードを再insertし、古いデータはvacuumでクリーンアップする
トランザクション番号TXID
トランザクションに関する情報
tuple headに存在する
トランザクションの実装
各行にはxminとxmaxの2つのフィールドがあります
トランザクションIDの増加
トランザクション可視性判定
ID 2^32 , id 2^31 +1
2^32 - (2^31+2) = 2147483646
111 1111 1111 1111 1111 1111 1111 1110 > 0
ID 2^32, , 3
2^32 - 3 = 4294967293
1111 1111 1111 1111 1111 1111 1111 1101 < 0
トランザクションスナップショット関連関数
txid_current_snapshot()現在のスナップショットを取得txid_snapshot_xip(txid_snapshot)スナップショットで実行中のトランザクションID txid_を取得snapshot_xmax(txid_snapshot)スナップショットのxmax txid_を取得snapshot_xmin(txid_snapshot)スナップショットのxmin txid_を取得visible_in_snapshot(bigint,txid_current_snapshot)スナップショットにトランザクションIDが表示されるかどうか(サブトランザクションIDを使用しない)txid_status(bigint)は、現在のトランザクションのステータス、committed、aborted、in progress、またはトランザクションIDが古い場合nullを取得します.
現在のスナップショットの取得
txid_current_snapshot()形式xmin:xmax:xip_list
要約すると、簡単に言えば、所与のXID:XID∈[1,xmin)について、過去のトランザクションは、このスナップショットに対してすべて表示される;XID∈[xmin,xmax)は、サブトランザクションの状況を考慮せず、依然としてIN_PROGRESS状態にある、非表示;COMMITED状態、可視;ABORTED状態、非表示;XID∈[xmax,∞)は、将来のトランザクションは、このスナップショットに対してすべて表示されない;
--session 1
testdb=# begin;
BEGIN
testdb=# select txid_current();
txid_current
--------------
1303
testdb=# select txid_current_snapshot();
txid_current_snapshot
-----------------------
1303:1303:
--session 2
testdb=# begin;
BEGIN
testdb=# select txid_current();
txid_current
--------------
1304
--session 3
testdb=# begin;
BEGIN
testdb=# select txid_current();
txid_current
--------------
1305
--session 4
testdb=# begin;
BEGIN
testdb=# select txid_current();
txid_current
--------------
1306
--session 1
testdb=# select txid_current_snapshot();
txid_current_snapshot
-----------------------
1303:1303:
--session 4
testdb=# rollback;
ROLLBACK
--session 1
testdb=# select txid_current_snapshot();
txid_current_snapshot
-----------------------
1303:1307:1304,1305
--session 3
testdb=# rollback;
ROLLBACK
--session 1
testdb=# select txid_current_snapshot();
txid_current_snapshot
-----------------------
1303:1307:1304