MVCC-3. αž€αŸ†αžŽαŸ‚αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„β€‹αž”αžΆαž“β€‹αž–αž·αž…αžΆαžšαžŽαžΆβ€‹αž›αžΎβ€‹αž”αž‰αŸ’αž αžΆβ€‹αžŠαŸ‚αž›β€‹αž‘αžΆαž€αŸ‹αž‘αž„β€‹αž“αžΉαž„ αž’αŸŠαžΈαžŸαžΌαž‘αž„αŸ‹αž“αž·αž„αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαžŠαž€αžαž™αž’αŸ†αž–αžΈ αžšαŸ€αž”αž…αŸ†αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž‘αžΆαž”. αž αžΎαž™αž‘αžΈαž”αŸ†αž•αž»αžαž™αžΎαž„αž”αžΆαž“αž‘αŸ…αžŠαž›αŸ‹αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αŸ†αž•αž»αž - αž€αŸ†αžŽαŸ‚αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαŸ”

αž”αž‹αž˜αž€αžαžΆ

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž˜αž€αž αžΎαž™ αž‡αž½αžšαž“αžΈαž˜αž½αž™αŸ—αž’αžΆαž…αž˜αžΆαž“αž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž€αŸ†αžŽαŸ‚β€‹αž˜αž½αž™β€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚β€‹αž˜αžΆαž“β€‹αž›αž€αŸ’αžαžŽαŸˆβ€‹αžαž»αžŸβ€‹αž”αŸ’αž›αŸ‚αž€β€‹αž–αžΈβ€‹αž€αŸ†αžŽαŸ‚β€‹αž˜αž½αž™β€‹αž•αŸ’αžŸαŸαž„β€‹αž‘αŸ€αžβ€‹αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž‚αŸ„αž›β€‹αž”αŸ†αžŽαž„β€‹αž“αŸαŸ‡ αž€αŸ†αžŽαŸ‚β€‹αž“αžΈαž˜αž½αž™αŸ—β€‹αž˜αžΆαž“β€‹αžŸαž‰αŸ’αž‰αžΆβ€‹αž–αžΈαžšβ€‹αžŠαŸ‚αž›β€‹αž€αŸ†αžŽαžαŸ‹ "αž–αŸαž›αžœαŸαž›αžΆ" αž“αŸƒβ€‹αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–β€‹αž“αŸƒβ€‹αž€αŸ†αžŽαŸ‚β€‹αž“αŸαŸ‡ (xmin αž“αž·αž„ xmax)αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αŸ’αžšαž„αŸ‹ - αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž–αŸαž›αžœαŸαž›αžΆαžŠαžΌαž…αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ„αŸ‡αž‘αŸαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαžšαžΆαž”αŸ‹αž€αžΎαž“αž‘αžΎαž„αž–αž·αžŸαŸαžŸαŸ” αž αžΎαž™αž”αž‰αŸ’αž‡αžšαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”

(αžŠαžΌαž…αž’αž˜αŸ’αž˜αžαžΆ αž€αžΆαžšαž–αž·αžαž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ– αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž·αž“αž’αžΆαž…αž€αžΎαž“αž‘αžΎαž„αž‚αŸ’αžšαž”αŸ‹αž–αŸαž›αž‘αŸ αžŠαŸ„αž™αžŸαžΆαžšαžŸαž˜αžαŸ’αžαž—αžΆαž–αž”αŸŠαžΈαžαž˜αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αž”αž‰αŸ’αž‡αžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž±αŸ’αž™αž”αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸ…αž–αŸαž›αž™αžΎαž„αžˆαžΆαž“αžŠαž›αŸ‹αž€αžΆαžšαž”αž„αŸ’αž€αž€αŸ”)

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‡αž½αžšαžŠαŸαž€αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž xmin αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž…αŸαž‰αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ INSERT αž αžΎαž™ xmax αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž…αŸ„αž›αŸ”

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‡αž½αžšαžŠαŸαž€αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž” αžαž˜αŸ’αž›αŸƒ xmax αž“αŸƒαž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ„αž™αž…αŸ†αž“αž½αž“αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž›αž»αž”αŸ”

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‡αž½αžšαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ‚αž”αŸ’αžšαŸ‚αžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ UPDATE αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ– DELETE αž“αž·αž„ INSERT αŸ” αž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž‡αž½αžšαžŠαŸαž€αž€αŸ†αžŽαžαŸ‹ xmax αžŸαŸ’αž˜αžΎαž“αžΉαž„αž…αŸ†αž“αž½αž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎ UPDATE αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ” αžαž˜αŸ’αž›αŸƒ xmin αžšαž”αžŸαŸ‹αžœαžΆαžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αžΉαž„αžαž˜αŸ’αž›αŸƒ xmax αž“αŸƒαž€αŸ†αžŽαŸ‚αž˜αž»αž“αŸ”

αžœαžΆαž› xmin αž“αž·αž„ xmax αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆαž€αŸ†αžŽαŸ‚αž‡αž½αžšαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαžœαžΆαž›αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž”αž‹αž˜αž€αžαžΆαž˜αžΆαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž§αž‘αžΆαž αžšαžŽαŸαŸ–

  • infomask αž‚αžΊαž‡αžΆαžŸαŸŠαŸαžšαžΈαž“αŸƒαž”αŸŠαžΈαžαžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž“αŸƒαž€αŸ†αžŽαŸ‚αž“αŸαŸ‡αŸ” αž˜αžΆαž“αž…αŸ’αžšαžΎαž“αžŽαžΆαžŸαŸ‹αž“αŸƒαž–αž½αž€αž‚αŸ; αž™αžΎαž„αž“αžΉαž„αž–αž·αž…αžΆαžšαžŽαžΆαž”αž“αŸ’αžαž·αž…αž˜αŸ’αžαž„ αŸ—
  • ctid αž‚αžΊβ€‹αž‡αžΆβ€‹αžαŸ†αžŽβ€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹β€‹αž€αŸ†αžŽαŸ‚β€‹αžαŸ’αž˜αžΈβ€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž“αŸƒβ€‹αž”αž“αŸ’αž‘αžΆαžαŸ‹β€‹αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αŸ†αžŽαŸ‚β€‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“β€‹αž”αŸ†αž•αž»αžβ€‹αž“αŸƒβ€‹αžαŸ’αžŸαŸ‚β€‹αž’αž€αŸ’αžŸαžš ctid αžŸαŸ†αžŠαŸ…β€‹αž›αžΎβ€‹αž€αŸ†αžŽαŸ‚β€‹αž“αŸαŸ‡β€‹αžαŸ’αž›αž½αž“β€‹αž―αž„αŸ” αž›αŸαžαž˜αžΆαž“αž‘αž˜αŸ’αžšαž„αŸ‹ (x,y) αžŠαŸ‚αž› x αž‡αžΆαž›αŸαžαž‘αŸ†αž–αŸαžš y αž‡αžΆαž›αŸαžαž›αž·αž”αž·αž€αŸ’αžšαž˜αž€αŸ’αž“αž»αž„αž’αžΆαžšαŸαŸ”
  • null bitmap - αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž‡αž½αžšαžˆαžšαž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αž“αŸƒαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžŠαŸ‚αž›αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž‘αž‘αŸ (NULL) αŸ” NULL αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžαž˜αŸ’αž›αŸƒαž”αŸ’αžšαž—αŸαž‘αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αž˜αŸ’αž˜αžαžΆαž˜αž½αž™αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‚αž»αžŽαž›αž€αŸ’αžαžŽαŸˆαžαŸ’αžšαžΌαžœαžαŸ‚αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ”

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž”αž‹αž˜αž€αžαžΆαž˜αžΆαž“αž‘αŸ†αž αŸ†αž’αŸ†αžŽαžΆαžŸαŸ‹ - αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ 23 αž”αŸƒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαž”αž“αŸ’αž‘αžΆαžαŸ‹ αž αžΎαž™αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž“αŸαŸ‡αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ NULL bitmap αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαžΆαžšαžΆαž„αž‚αžΊ "αžαžΌαž…αž…αž„αŸ’αž’αŸ€αž" (αž“αŸ„αŸ‡αž‚αžΊαž˜αžΆαž“αž‡αž½αžšαžˆαžšαž–αžΈαžšαž”αžΈ) αž“αŸ„αŸ‡αžαž˜αŸ’αž›αŸƒαž›αžΎαžŸαž’αžΆαž…αž‘αž‘αž½αž›αž™αž€αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαŸ”

αž”αž‰αŸ’αž…αžΌαž›

αž…αžΌαžšαž™αžΎαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαž€αž˜αŸ’αžšαž·αžαž‘αžΆαž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž αžŠαŸ„αž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αžαŸ’αž˜αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž‡αž½αžšαžˆαžšαž–αžΈαžš αž“αž·αž„αž›αž·αž”αž·αž€αŸ’αžšαž˜αž›αžΎαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αžœαžΆαŸ–

=> CREATE TABLE t(
  id serial,
  s text
);
=> CREATE INDEX ON t(s);

αžŸαžΌαž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αž½αžšαž˜αž½αž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”

=> BEGIN;
=> INSERT INTO t(s) VALUES ('FOO');

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

=> SELECT txid_current();
 txid_current 
--------------
         3664
(1 row)

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž‘αŸ†αž–αŸαžšαŸ” αž˜αž»αžαž„αžΆαžš heap_page_items αž“αŸƒαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ pageinspect αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž‘αŸ’αžšαž“αž·αž… αž“αž·αž„αž€αŸ†αžŽαŸ‚αž‡αž½αžšαŸ–

=> SELECT * FROM heap_page_items(get_raw_page('t',0)) gx
-[ RECORD 1 ]-------------------
lp          | 1
lp_off      | 8160
lp_flags    | 1
lp_len      | 32
t_xmin      | 3664
t_xmax      | 0
t_field3    | 0
t_ctid      | (0,1)
t_infomask2 | 2
t_infomask  | 2050
t_hoff      | 24
t_bits      | 
t_oid       | 
t_data      | x0100000009464f4f

αž…αŸ†αžŽαžΆαŸ†αžαžΆαž–αžΆαž€αŸ’αž™ heap αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL αžŸαŸ†αžŠαŸ…αž›αžΎαžαžΆαžšαžΆαž„αŸ” αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžΎβ€‹αž–αžΆαž€αŸ’αž™β€‹αž…αž˜αŸ’αž›αŸ‚αž€β€‹αž˜αž½αž™β€‹αž‘αŸ€αžβ€‹αž“αŸƒβ€‹αž–αžΆαž€αŸ’αž™β€‹αž“αŸαŸ‡ - heap αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‚αŸβ€‹αžŸαŸ’αž‚αžΆαž›αŸ‹ αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αžαžΆαžšαžΆαž„αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž–αžΆαž€αŸ’αž™αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž“αŸαž™αž“αŸƒ "αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αžšαž½αž˜αž‚αŸ’αž“αžΆ" αž•αŸ’αž‘αž»αž™αž‘αŸ…αž“αžΉαž„αž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαŸ”

αž˜αž»αžαž„αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž‘αž·αž“αŸ’αž“αž“αŸαž™ β€œαžŠαžΌαž…β€ αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž–αž·αž”αžΆαž€αž™αž›αŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹ αž™αžΎαž„αž“αžΉαž„αž‘αž»αž€αžαŸ‚αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž–αŸαžαŸŒαž˜αžΆαž“ αž αžΎαž™αž”αž€αžŸαŸ’αžšαžΆαž™αžœαžΆαŸ–

=> SELECT '(0,'||lp||')' AS ctid,
       CASE lp_flags
         WHEN 0 THEN 'unused'
         WHEN 1 THEN 'normal'
         WHEN 2 THEN 'redirect to '||lp_off
         WHEN 3 THEN 'dead'
       END AS state,
       t_xmin as xmin,
       t_xmax as xmax,
       (t_infomask & 256) > 0  AS xmin_commited,
       (t_infomask & 512) > 0  AS xmin_aborted,
       (t_infomask & 1024) > 0 AS xmax_commited,
       (t_infomask & 2048) > 0 AS xmax_aborted,
       t_ctid
FROM heap_page_items(get_raw_page('t',0)) gx
-[ RECORD 1 ]-+-------
ctid          | (0,1)
state         | normal
xmin          | 3664
xmax          | 0
xmin_commited | f
xmin_aborted  | f
xmax_commited | f
xmax_aborted  | t
t_ctid        | (0,1)

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαŸ–

  • αž”αž“αŸ’αžαŸ‚αž˜αž›αŸαžαžŸαžΌαž“αŸ’αž™αž‘αŸ…αž›αŸαžαž›αž·αž”αž·αž€αŸ’αžšαž˜ αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž… t_ctidαŸ– (αž›αŸαžαž‘αŸ†αž–αŸαžš αž›αŸαžαž›αž·αž”αž·αž€αŸ’αžšαž˜)αŸ”
  • αžŒαž·αž‚αŸ’αžšαžΈαž”αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž‘αŸ’αžšαž“αž·αž… lp_flags αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžœαžΆ "αž’αž˜αŸ’αž˜αžαžΆ" - αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž‘αŸ’αžšαž“αž·αž…αž–αž·αžαž‡αžΆαžŸαŸ†αžŠαŸ…αž‘αŸ…αž›αžΎαž€αŸ†αžŽαŸ‚αž“αŸƒαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαŸ” αž™αžΎαž„αž“αžΉαž„αž˜αžΎαž›αž’αžαŸ’αžαž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”
  • αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αŸαžαŸŒαž˜αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž˜αžΆαž“αžαŸ‚αž–αžΈαžšαž‚αžΌαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡αŸ” αž”αŸŠαžΈαž xmin_committed αž“αž·αž„ xmin_aborted αž”αž„αŸ’αž αžΆαž‰αžαžΆαžαžΎαž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš xmin αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž (αž”αŸ„αŸ‡αž”αž„αŸ‹)αŸ” αž”αŸŠαžΈαžαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž–αžΈαžšαžŸαŸ†αžŠαŸ…αž›αžΎαž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš xmax αŸ”

αžαžΎαž™αžΎαž„αžƒαžΎαž‰αž’αŸ’αžœαžΈ? αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž‡αž½αžšαžŠαŸαž€ αž›αž·αž”αž·αž€αŸ’αžšαž˜αž›αŸαž 1 αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαžαžΆαžšαžΆαž„ αžŠαŸ„αž™αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž€αŸ†αžŽαŸ‚αž‘αžΈαž˜αž½αž™ αž“αž·αž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž“αŸƒαž‡αž½αžšαžŠαŸαž€αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš αžœαžΆαž› xmin αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž–αŸαž‰αžŠαŸ„αž™αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ…αžαŸ‚αžŸαž€αž˜αŸ’αž˜ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αžΆαŸ†αž„ xmin_committed αž“αž·αž„ xmin_aborted bits αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸαŸ”

αžœαžΆαž› ctid αž€αŸ†αžŽαŸ‚β€‹αž‡αž½αžšβ€‹αžŠαŸαž€β€‹αžŸαŸ†αžŠαŸ…β€‹αž‘αŸ…β€‹αž›αžΎβ€‹αž‡αž½αžšβ€‹αžŠαŸαž€β€‹αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆαŸ” αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž˜αž·αž“αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž‡αžΆαž„αž“αŸαŸ‡αž‘αŸαŸ”

αžœαžΆαž› xmax αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ†αž–αŸαž‰β€‹αžŠαŸ„αž™β€‹αž›αŸαžβ€‹αž’αžαŸ‹αž…αŸαŸ‡β€‹αžŸαŸ„αŸ‡ 0 αž–αŸ’αžšαŸ„αŸ‡β€‹αž€αŸ†αžŽαŸ‚β€‹αž“αŸƒβ€‹αž‡αž½αžšβ€‹αžŠαŸαž€β€‹αž“αŸαŸ‡β€‹αž˜αž·αž“β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž›αž»αž”β€‹αž…αŸαž‰β€‹αž‘αŸ αž αžΎαž™β€‹αž‚αžΊβ€‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΉαž„αž˜αž·αž“αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αž›αŸαžαž“αŸαŸ‡αž‘αŸ αžŠαŸ„αž™αžŸαžΆαžš xmax_aborted bit αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αŸ”

αž…αžΌαžšαž™αžΎαž„αž”αŸ„αŸ‡αž‡αŸ†αž αžΆαž“αž˜αž½αž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž†αŸ’αž–αŸ„αŸ‡αž‘αŸ…αžšαž€αž€αžΆαžšαž€αŸ‚αž›αž˜αŸ’αž’αž›αž‘αŸ’αž’αž—αžΆαž–αž’αžΆαž“αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž–αŸαžαŸŒαž˜αžΆαž“αž”αŸŠαžΈαžαž‘αŸ…αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αž αžΎαž™αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž„αžΆαžšαž˜αž½αž™ αž–αŸ’αžšαŸ„αŸ‡αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαŸ†αžŽαžΎαž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αŸ’αžαž„αŸ–

=> CREATE FUNCTION heap_page(relname text, pageno integer)
RETURNS TABLE(ctid tid, state text, xmin text, xmax text, t_ctid tid)
AS $$
SELECT (pageno,lp)::text::tid AS ctid,
       CASE lp_flags
         WHEN 0 THEN 'unused'
         WHEN 1 THEN 'normal'
         WHEN 2 THEN 'redirect to '||lp_off
         WHEN 3 THEN 'dead'
       END AS state,
       t_xmin || CASE
         WHEN (t_infomask & 256) > 0 THEN ' (c)'
         WHEN (t_infomask & 512) > 0 THEN ' (a)'
         ELSE ''
       END AS xmin,
       t_xmax || CASE
         WHEN (t_infomask & 1024) > 0 THEN ' (c)'
         WHEN (t_infomask & 2048) > 0 THEN ' (a)'
         ELSE ''
       END AS xmax,
       t_ctid
FROM heap_page_items(get_raw_page(relname,pageno))
ORDER BY lp;
$$ LANGUAGE SQL;

αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸαŸ‡ αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆαž“αŸƒαž€αŸ†αžŽαŸ‚αž‡αž½αžšαŸ–

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3664 | 0 (a) | (0,1)
(1 row)

αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αžŸαžΌαžœαž›αž˜αŸ’αž’αž·αžαž‘αŸ αž–αŸαžαŸŒαž˜αžΆαž“αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž–αžΈαžαžΆαžšαžΆαž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αžŠαŸ„αž™αž”αŸ’αžšαžΎ pseudo-columns xmin αž“αž·αž„ xmaxαŸ–

=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3664 |    0 |  1 | FOO
(1 row)

αž€αžΆαžšαž‡αž½αžŸαž‡αž»αž›

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž„αž…αžΆαŸ†αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆ - αž…αŸ†αžŽαžΆαŸ†αžαžΆαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž αŸ…αžαžΆ XACT αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ (αž αžΎαž™αž˜αž»αž“αž€αŸ†αžŽαŸ‚ 10 αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ CLOG (commit log) αž αžΎαž™αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸαŸ‡αž“αŸ…αžαŸ‚αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ)αŸ”

XACT αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžαžΆαžšαžΆαž„αž€αžΆαžαžΆαž‘αž»αž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αŸαŸ” αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš PGDATA/pg_xact αŸ” αž–αž½αž€αž‚αŸαž˜αžΆαž“αž–αžΈαžšαž”αŸŠαžΈαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αŸ– αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž›αž»αž”αž…αŸ„αž› - αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆαž€αŸ†αžŽαŸ‚αž‡αž½αžšαŸ” αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αž‘αŸ…αž‡αžΆαž―αž€αžŸαžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αžœαž·αž‰αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αž€αŸ” αž αžΎαž™αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž˜αž½αž™αž‘αŸ†αž–αŸαžšαžŠαŸ„αž™αž‘αŸ†αž–αŸαžšαžŠαžΌαž…αž‡αžΆαž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αžŠαž‘αŸƒαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ XACT αž”αŸŠαžΈαžαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡αŸ” αž αžΎαž™αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αž€αŸ†αž‘αž»αž„αž–αŸαž›αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αž (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž™αžΎαž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž“αŸƒαž€αžΆαžšαžαžαž‘αž»αž€αž˜αž»αž“αž€αŸαžŠαŸ„αž™)αŸ”

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‘αŸ†αž–αŸαžšαžαžΆαžšαžΆαž„αžŠαŸ‚αž›αž™αžΎαž„αž‘αžΎαž”αžαŸ‚αž”αžΆαž“αž˜αžΎαž› αžœαžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž†αŸ’αž›αžΎαž™αžŸαŸ†αžŽαž½αžšαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

  1. αžαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš xmin αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž αžΎαž™αž¬αž“αŸ…? αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸ αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž“αŸƒαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαž˜αž·αž“αž‚αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž˜αžΎαž›αžƒαžΎαž‰αž‘αŸαŸ”
    αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž˜αžΎαž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžšαž½αž˜αž“αŸƒαžœαžαŸ’αžαž»αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ ProcArray αŸ” αžœαžΆαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αŸαžαž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ (αžŸαž€αž˜αŸ’αž˜) αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αŸ”
  2. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αžαžΎαž’αŸ’αžœαžΎαžŠαžΌαž…αž˜αŸ’αžαŸαž… - αžŠαŸ„αž™αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž¬αž›αž»αž”αž…αŸ„αž›? αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž”αžΆαž“β€‹αž”αŸ„αŸ‡αž”αž„αŸ‹ αž“αŸ„αŸ‡β€‹αž€αŸ†αžŽαŸ‚β€‹αž‡αž½αžšβ€‹αžŠαŸαž€β€‹αž€αŸβ€‹αž˜αž·αž“β€‹αž‚αž½αžšβ€‹αž˜αžΎαž›β€‹αžƒαžΎαž‰β€‹αžŠαŸ‚αžšαŸ”
    αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž› XACT αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž‘αŸ†αž–αŸαžšαž…αž»αž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹ XACT αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž€αŸ’αž“αž»αž„ RAM αž€αŸαžŠαŸ„αž™ αžœαžΆαž“αŸ…αžαŸ‚αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžαŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ XACT αžšαžΆαž›αŸ‹αž–αŸαž›αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹ xmin_committed αž“αž·αž„ xmin_aborted bits αž“αŸƒαž€αŸ†αžŽαŸ‚αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸŠαžΈαžαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž”αŸŠαžΈαžαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ αž“αŸ„αŸ‡αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš xmin αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαžŸαŸ’αž‚αžΆαž›αŸ‹ αž αžΎαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αžΉαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αžΌαž›αž”αŸ’αžšαžΎ XACT αž‘αŸαŸ”

αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž”αŸŠαžΈαžαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αž›αž½αž“αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹? αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž€αžΎαžαž‘αžΎαž„ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž·αž“αž‘αžΆαž“αŸ‹αžŠαžΉαž„αžαžΆαžαžΎαžœαžΆαž“αžΉαž„αž‡αŸ„αž‚αž‡αŸαž™αž¬αž™αŸ‰αžΆαž„αžŽαžΆαž“αŸ„αŸ‡αž‘αŸαŸ” αž αžΎαž™β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžš αžœαžΆβ€‹αž˜αž·αž“β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž‘αŸ€αžβ€‹αž‘αŸβ€‹αžαžΆβ€‹αž‘αŸ†αž–αŸαžšβ€‹αžŽαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌαžšαŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αž‘αŸ†αž–αŸαžšαž”αŸ‚αž”αž“αŸαŸ‡αž…αŸ’αžšαžΎαž“ αž αžΎαž™αž€αžΆαžšαž‘αž“αŸ’αž‘αŸαž‰αžœαžΆαž‚αžΊαž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž‘αŸ†αž–αŸαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŽαŸ’αžαŸαž‰αž…αŸαž‰αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αžαžΆαžŸαŸ” αž€αžΆαžšαž’αžΆαž“αž–αž½αž€αžœαžΆαž˜αŸ’αžαž„αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸŠαžΈαžαž“αžΉαž„αž”αž“αŸ’αžαž™αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ”

αž€αžΆαžšαž’αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡αž“αŸƒαž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αž‚αžΊαžαžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŽαžΆαž˜αž½αž™ (αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž˜αž½αž™αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž’αžΆαž“αžŸαžΆαž˜αž‰αŸ’αž‰ - SELECT) αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ†αž–αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž…αžΌαžšβ€‹αž™αžΎαž„β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžŠαžΌαžšαŸ”

=> COMMIT;

αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž‘αŸ (αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αžŠαžΉαž„αžαžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„ XACT)αŸ–

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3664 | 0 (a) | (0,1)
(1 row)

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž…αžΌαž›αž”αŸ’αžšαžΎαž‘αŸ†αž–αŸαžšαžŠαŸ†αž”αžΌαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš xmin αž αžΎαž™αžŸαžšαžŸαŸαžšαžœαžΆαž‘αŸ…αž”αŸŠαžΈαžαž–αŸαžαŸŒαž˜αžΆαž“αŸ–

=> SELECT * FROM t;
 id |  s  
----+-----
  1 | FOO
(1 row)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3664 (c) | 0 (a) | (0,1)
(1 row)

αž›αž»αž”

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‡αž½αžšαžŠαŸαž€αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž” αž›αŸαžαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αž»αž”αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αžœαžΆαž› xmax αž“αŸƒαž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž αžΎαž™ xmax_aborted bit αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž˜αŸ’αžšαŸ‡αŸ”

αž…αŸ†αžŽαžΆαŸ†αžαžΆαžαž˜αŸ’αž›αŸƒαž€αŸ†αžŽαžαŸ‹αž“αŸƒ xmax αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαž€αž˜αŸ’αž˜αžŠαžΎαžšαžαž½αž‡αžΆαž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αž‡αž½αžšαžŠαŸαž€αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž…αž„αŸ‹αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž– αž¬αž›αž»αž”αž‡αž½αžšαž“αŸαŸ‡ αžœαžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αžαŸ†αž±αŸ’αž™αžšαž„αŸ‹αž…αžΆαŸ†αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš xmax αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαž›αž“αŸαŸ‡ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž…αŸ†αžŽαžΆαŸ†αžαžΆαž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αž‡αž½αžšαžŠαŸαž€αž‚αžΊαž‚αŸ’αž˜αžΆαž“αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αŸ” αž–αž½αž€αž‚αŸαž˜αž·αž“αž™αž€αž€αž“αŸ’αž›αŸ‚αž„αž‘αŸ†αž“αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ RAM αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž·αž“αž‘αž‘αž½αž›αžšαž„αž–αžΈαž›αŸαžαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž‘αŸαŸ” αž–αž·αž αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš "αž™αžΌαžš" αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž…αŸ’αžšαžΎαž“αž‘αŸ€αžαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”

αžαŸ„αŸ‡αž›αž»αž”αž”αž“αŸ’αž‘αžΆαžαŸ‹αŸ”

=> BEGIN;
=> DELETE FROM t;
=> SELECT txid_current();
 txid_current 
--------------
         3665
(1 row)

αž™αžΎαž„αžƒαžΎαž‰αžαžΆαž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αžœαžΆαž› xmax αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸŠαžΈαžαž–αŸαžαŸŒαž˜αžΆαž“αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸαŸ–

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax | t_ctid 
-------+--------+----------+------+--------
 (0,1) | normal | 3664 (c) | 3665 | (0,1)
(1 row)

αž€αžΆαžšαž›αž»αž”αž…αŸ„αž›

αž€αžΆαžšαž›αž»αž”αž…αŸ„αž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž€αžΆαžšαž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαžŠαŸ‚αžš αž˜αžΆαž“αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„ XACT αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž”αŸŠαžΈαžαžŠαŸ‚αž›αž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αž€αžΆαžšαž˜αž·αž“αž’αŸ’αžœαžΎαž‚αžΊαž›αžΏαž“αžŠαžΌαž…αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ ROLLBACK αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αžšαž›αž”αŸ‹αž˜αž€αžœαž·αž‰αž‘αŸαŸ– αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αžαŸ‚αž˜αž·αž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ”

=> ROLLBACK;
=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax | t_ctid 
-------+--------+----------+------+--------
 (0,1) | normal | 3664 (c) | 3665 | (0,1)
(1 row)

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‘αŸ†αž–αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΌαž›αž”αŸ’αžšαžΎ αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™ αž αžΎαž™αž”αŸŠαžΈαžαž‡αŸ†αž“αž½αž™ xmax_aborted αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž‡αžΆαž€αŸ†αžŽαŸ‚αž‡αž½αžšαŸ” αž›αŸαž xmax αžαŸ’αž›αž½αž“αžœαžΆαž“αŸ…αžαŸ‚αž˜αžΆαž“αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž“αžΉαž„αž˜αžΎαž›αžœαžΆαž‘αŸαŸ”

=> SELECT * FROM t;
 id |  s  
----+-----
  1 | FOO
(1 row)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   |   xmax   | t_ctid 
-------+--------+----------+----------+--------
 (0,1) | normal | 3664 (c) | 3665 (a) | (0,1)
(1 row)

αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–

αž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž›αž»αž”αž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž‡αž½αžšαžŠαŸαž€αžŠαŸ†αž”αžΌαž„ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž‰αŸ’αž…αžΌαž›αžαŸ’αž˜αžΈαž˜αž½αž™αŸ”

=> BEGIN;
=> UPDATE t SET s = 'BAR';
=> SELECT txid_current();
 txid_current 
--------------
         3666
(1 row)

αžŸαŸ†αžŽαž½αžšαž”αž„αŸ’αž€αžΎαžαž˜αž½αž™αž‡αž½αžš (αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈ)αŸ–

=> SELECT * FROM t;
 id |  s  
----+-----
  1 | BAR
(1 row)

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž™αžΎαž„αžƒαžΎαž‰αž€αŸ†αžŽαŸ‚αž‘αžΆαŸ†αž„αž–αžΈαžšαŸ–

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3664 (c) | 3666  | (0,2)
 (0,2) | normal | 3666     | 0 (a) | (0,2)
(2 rows)

αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž›αž»αž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ„αž™αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› xmax αŸ” αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αžαž˜αŸ’αž›αŸƒαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž›αžΎαžαž˜αŸ’αž›αŸƒαž…αžΆαžŸαŸ‹ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž»αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αŸ” αž αžΎαž™ xmax_aborted bit αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž˜αŸ’αžšαŸ‡ αžŠαŸ„αž™αžŸαžΆαžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž˜αž·αž“αž‘αžΆαž“αŸ‹αžŠαžΉαž„αž“αŸ…αž‘αžΎαž™αŸ”

αž€αŸ†αžŽαŸ‚αžŠαŸ†αž”αžΌαž„αž“αŸƒαž”αž“αŸ’αž‘αžΆαžαŸ‹αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαŸ†αžŠαŸ…αž‘αŸ…αž›αžΎαž‘αžΈαž–αžΈαžš (t_ctid field) αž‡αžΆαž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž‡αžΆαž„αž“αŸαŸ‡αŸ”

αž›αž·αž”αž·αž€αŸ’αžšαž˜αž‘αžΈαž–αžΈαžšαž›αŸαž…αž‘αžΎαž„αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž›αž·αž”αž·αž€αŸ’αžšαž˜ αž αžΎαž™αž‡αž½αžšαž‘αžΈαž–αžΈαžšαž™αŸ„αž„αž€αŸ†αžŽαŸ‚αž‘αžΈαž–αžΈαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαžαžΆαžšαžΆαž„αŸ”

αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αžΆαžšαž›αž»αž”αžŠαŸ‚αžš αžαž˜αŸ’αž›αŸƒ xmax αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αžŠαŸ†αž”αžΌαž„αž“αŸƒαž‡αž½αžšαžŠαŸαž€αž‚αžΊαž‡αžΆαž€αžΆαžšαž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αžαžΆαž‡αž½αžšαžŠαŸαž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž€αŸ‹αžŸαŸ„αŸ”

αž…αžΌαžšαž™αžΎαž„αž”αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”

=> COMMIT;

αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸ

αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž‘αŸ†αž–αŸαžšαžαžΆαžšαžΆαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸ?

αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž›αž·αž”αž·αž€αŸ’αžšαž˜αž”αŸ’αžšαŸ‚αž”αŸ’αžšαž½αž›αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž”αŸ’αžšαž—αŸαž‘αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž›αž·αž”αž·αž€αŸ’αžšαž˜αŸ” αž αžΎαž™αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž›αž·αž”αž·αž€αŸ’αžšαž˜αž˜αž½αž™αž€αŸαž˜αžΆαž“αž”αŸ’αžšαž—αŸαž‘αž‘αŸ†αž–αŸαžšαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαžŠαŸ‚αžšαŸ” αž§αž‘αžΆαž αžšαžŽαŸ B-tree αž˜αžΆαž“αž‘αŸ†αž–αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆ αž“αž·αž„αž‘αŸ†αž–αŸαžš "αž‘αŸ€αž„αž‘αžΆαžαŸ‹" αŸ”

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‘αŸ†αž–αŸαžšαž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž˜αžΆαž“αž’αžΆαžšαŸαž“αŸƒαž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž‡αž½αžšαžŠαŸαž€ αž“αž·αž„αž‡αž½αžšαžŠαŸαž€αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ (αžŠαžΌαž…αž‡αžΆαž‘αŸ†αž–αŸαžšαžαžΆαžšαžΆαž„)αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž‘αŸ†αž–αŸαžšαž˜αžΆαž“αž€αž“αŸ’αž›αŸ‚αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αž·αžŸαŸαžŸαŸ”

αž‡αž½αžšβ€‹αžŠαŸαž€β€‹αž€αŸ’αž“αž»αž„β€‹αž›αž·αž”αž·αž€αŸ’αžšαž˜β€‹αž€αŸβ€‹αž’αžΆαž…β€‹αž˜αžΆαž“β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αžαž»αžŸβ€‹αž‚αŸ’αž“αžΆβ€‹αžαŸ’αž›αžΆαŸ†αž„β€‹αžŠαŸ‚αžšβ€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αž”αŸ’αžšαž—αŸαž‘β€‹αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž˜αŸ‚αž€αž’αžΆαž„ B αž‡αž½αžšβ€‹αžŠαŸ‚αž›β€‹αž‘αžΆαž€αŸ‹αž‘αž„β€‹αž“αžΉαž„β€‹αž‘αŸ†αž–αŸαžšβ€‹αžŸαŸ’αž›αžΉαž€β€‹αž˜αžΆαž“β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž‚αž“αŸ’αž›αžΉαŸ‡β€‹αž’αŸ’αžœαžΎβ€‹αž›αž·αž”αž·αž€αŸ’αžšαž˜ αž“αž·αž„β€‹αž―αž€αžŸαžΆαžšβ€‹αž™αŸ„αž„ (ctid) αž‘αŸ…β€‹αž‡αž½αžšβ€‹αžαžΆαžšαžΆαž„β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž‚αŸ’αž“αžΆαŸ” αž‡αžΆαž‘αžΌαž‘αŸ… αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžαžΆαž˜αžšαž”αŸ€αž”αžαž»αžŸαž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αŸ”

αž…αŸ†αžŽαž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž‚αžΊαžαžΆαž˜αž·αž“αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αž‡αž½αžšαž“αŸ…αž€αŸ’αž“αž»αž„αž›αž·αž”αž·αž€αŸ’αžšαž˜αž“αŸƒαž”αŸ’αžšαž—αŸαž‘αžŽαžΆαž˜αž½αž™αž‘αžΎαž™αŸ” αž¬αž™αžΎαž„αž’αžΆαž…αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž”αž“αŸ’αž‘αžΆαžαŸ‹αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αž€αŸ†αžŽαŸ‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž˜αž·αž“αž˜αžΆαž“αžœαžΆαž› xmin αž“αž·αž„ xmax αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆαž‡αž½αžšαžŠαŸαž€αž›αž·αž”αž·αž€αŸ’αžšαž˜αž‘αŸαŸ” αž™αžΎαž„αž’αžΆαž…αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž–αžΈαž›αž·αž”αž·αž€αŸ’αžšαž˜αž“αžΆαŸ†αž‘αŸ…αžŠαž›αŸ‹αž€αŸ†αžŽαŸ‚αžαžΆαžšαžΆαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž‡αž½αžš - αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αžαžΆαžαžΎαž€αŸ†αžŽαŸ‚αžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΉαž„αžƒαžΎαž‰αžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž˜αžΎαž›αžαžΆαžšαžΆαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” (αžŠαžΌαž…αžšαžΆαž›αŸ‹αžŠαž„ αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αžΆαžšαž–αž·αžαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž“αŸ„αŸ‡αž‘αŸαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžαŸ’αž›αŸ‡ αž•αŸ‚αž“αž‘αžΈαž—αžΆαž–αž˜αžΎαž›αžƒαžΎαž‰αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”)

αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸαŸ‡ αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž›αž·αž”αž·αž€αŸ’αžšαž˜ αž™αžΎαž„αžšαž€αžƒαžΎαž‰αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž€αŸ†αžŽαŸ‚αž‘αžΆαŸ†αž„αž–αžΈαžš αž‘αžΆαŸ†αž„αž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αž€αŸ†αžŽαŸ‚αž…αžΆαžŸαŸ‹αŸ–

=> SELECT itemoffset, ctid FROM bt_page_items('t_s_idx',1);
 itemoffset | ctid  
------------+-------
          1 | (0,2)
          2 | (0,1)
(2 rows)

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αž·αž˜αŸ’αž˜αž·αž

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž PostgreSQL αž”αŸ’αžšαžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžœαžΆ "αžšαž€αŸ’αžŸαžΆαž‘αž»αž€" αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžΆαž“αžαŸ‚αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžœαžΆαž˜αž·αž“αž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αž›αžΎαž—αžΆαž–αž˜αžΎαž›αžƒαžΎαž‰αž“αŸƒαž€αŸ†αžŽαŸ‚αž‡αž½αžšαž“αŸ„αŸ‡αž‘αŸαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ†αž”αžΌαž„αž…αŸαž‰ xid αž“αž·αž˜αŸ’αž˜αž·αžαž…αŸ†αž–αŸ„αŸ‡αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αž›αŸαžαž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž›αŸαžαž›αŸ†αžŠαžΆαž”αŸ‹αŸ”

αž€αžΆαžšαž…αŸαž‰αž›αŸαžαž“αŸαŸ‡αž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžšαžœαžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™αž›αžΏαž“αžŽαžΆαžŸαŸ‹αŸ” αž™αžΎαž„αž“αžΉαž„αžŸαŸ’αž‚αžΆαž›αŸ‹αž αŸαžαž»αž•αž›αž˜αž½αž™αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž›αŸαžαž“αž·αž˜αŸ’αž˜αž·αž αž“αŸ…αž–αŸαž›αž™αžΎαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αž€αŸ”

αž›αŸαžαž“αž·αž˜αŸ’αž˜αž·αžαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž™αž€αž˜αž€αž–αž·αž…αžΆαžšαžŽαžΆαžαžΆαž˜αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŽαžΆαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αžαžαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸαŸ”

αž“αŸ…αž…αŸ†αžŽαž»αž…αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆ αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αž·αž˜αŸ’αž˜αž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αŸαžαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαžšαž½αž…αž αžΎαž™ αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžšαžΏαž„αž’αž˜αŸ’αž˜αžαžΆαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž›αŸαžαž”αŸ‚αž”αž“αŸαŸ‡αž˜αž·αž“αž’αžΆαž…αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αžΆαž“αž‘αŸ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž“αŸ…αž–αŸαž›αž…αžΌαž›αž”αŸ’αžšαžΎαž‘αŸ†αž–αŸαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžœαžΆαž’αžΆαž…αž”αžΆαžαŸ‹αž”αž„αŸ‹αž’αžαŸ’αžαž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

=> BEGIN;
=> SELECT txid_current_if_assigned();
 txid_current_if_assigned 
--------------------------
                         
(1 row)

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ”

=> UPDATE accounts SET amount = amount - 1.00;
=> SELECT txid_current_if_assigned();
 txid_current_if_assigned 
--------------------------
                     3667
(1 row)

=> COMMIT;

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹

αžŸαž“αŸ’αžŸαŸ†αž–αž·αž“αŸ’αž‘αž»

αž€αŸ†αžŽαžαŸ‹αž€αŸ’αž“αž»αž„ SQL αžŸαž“αŸ’αžŸαŸ†αž–αž·αž“αŸ’αž‘αž» (savepoint) αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž›αž»αž”αž…αŸ„αž›αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αž˜αž·αž“αžšαŸ†αžαžΆαž“αžœαžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸαŸ‡αž˜αž·αž“αžŸαž˜αž“αžΉαž„αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžαžΆαž„αž›αžΎαž‘αŸ αžŠαŸ„αž™αžŸαžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆ αž αžΎαž™αž‡αžΆαžšαžΌαž”αžœαž“αŸ’αžαž˜αž·αž“αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αžœαž·αž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž‘αŸαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž˜αž»αžαž„αžΆαžšβ€‹αž“αŸαŸ‡ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αž“αŸ’αž›αŸ‚αž„β€‹αžšαž€αŸ’αžŸαžΆαž‘αž»αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ†αž”αŸ‚αž€β€‹αž‡αžΆβ€‹αž…αŸ’αžšαžΎαž“β€‹αžŠαŸ„αž™β€‹αž‘αŸ‚αž€β€‹αž–αžΈβ€‹αž‚αŸ’αž“αžΆαŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„ (subtransaction) αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž˜αžΆαž“αž›αŸαžαžšαŸ€αž„αžαŸ’αž›αž½αž“ (αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž…αŸ†αž“αž½αž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹)αŸ” αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαžαžΆαž˜αžšαž”αŸ€αž”αž’αž˜αŸ’αž˜αžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ XACT αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αž˜αŸ’αž”αž„αŸ– αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž› αž“αŸ„αŸ‡αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αž•αž„αžŠαŸ‚αžšαŸ”

αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ†αž”αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš PGDATA/pg_subtrans αŸ” αž―αž€αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΌαž›αž”αŸ’αžšαžΎαžαžΆαž˜αžšαž™αŸˆαžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžšαž”αžŸαŸ‹αžœαžαŸ’αžαž» αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ XACT αžŠαŸ‚αžšαŸ”

αž€αž»αŸ†αž…αŸ’αžšαž‘αŸ†αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΆαž˜αž½αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ’αžœαž™αŸαžαŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ’αžœαž™αŸαžαž˜αž·αž“αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αžαžΆαž˜αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŽαžΆαž˜αž½αž™αž‘αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž›αžΆαž€αŸ‹αž‘αž»αž€αŸ” αž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ’αžœαž™αŸαžαž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL αž’αž˜αŸ’αž˜αžαžΆαž‘αŸ αž αžΎαž™αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž›αŸ’αž’αž”αŸ†αž•αž»αžαŸ– αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŽαžΆαžŸαŸ‹ αž€αž˜αŸ’αžšαžŽαžΆαžŸαŸ‹ αž αžΎαž™αžœαžαŸ’αžαž˜αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„ DBMSs αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž”αž„αŸ’αž€αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžšαŸ†αž›αŸ„αž—αž”αŸ†αž–αžΆαž“ αžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž‘αž‘αž½αž›αžšαž„αž€αžΆαžšαžˆαžΊαž…αžΆαž”αŸ‹αŸ”

αžαŸ„αŸ‡αž›αž»αž”αžαžΆαžšαžΆαž„ αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž‡αž½αžšαžŠαŸαž€αŸ–

=> TRUNCATE TABLE t;
=> BEGIN;
=> INSERT INTO t(s) VALUES ('FOO');
=> SELECT txid_current();
 txid_current 
--------------
         3669
(1 row)

=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
(1 row)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3669 | 0 (a) | (0,1)
(1 row)

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αžŠαžΆαž€αŸ‹β€‹αž…αŸ†αžŽαž»αž…β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€ αž αžΎαž™β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž”αž“αŸ’αž‘αžΆαžαŸ‹β€‹αž˜αž½αž™β€‹αž‘αŸ€αžαŸ”

=> SAVEPOINT sp;
=> INSERT INTO t(s) VALUES ('XYZ');
=> SELECT txid_current();
 txid_current 
--------------
         3669
(1 row)

αž…αŸ†αžŽαžΆαŸ†αžαžΆαž’αž“αž»αž‚αž˜αž“αŸ txid_current() αžαŸ’αžšαž‘αž”αŸ‹αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹ αž˜αž·αž“αž˜αŸ‚αž“αž›αŸαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž‡αžΆαž”αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ”

=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
 3670 |    0 |  3 | XYZ
(2 rows)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  | xmin | xmax  | t_ctid 
-------+--------+------+-------+--------
 (0,1) | normal | 3669 | 0 (a) | (0,1)
 (0,2) | normal | 3670 | 0 (a) | (0,2)
(2 rows)

αž…αžΌαžšαž™αžΎαž„αžœαž·αž›αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž…αŸ†αžŽαž»αž…αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αžΈαž”αžΈαŸ”

=> ROLLBACK TO sp;
=> INSERT INTO t(s) VALUES ('BAR');
=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
 3671 |    0 |  4 | BAR
(2 rows)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3669     | 0 (a) | (0,1)
 (0,2) | normal | 3670 (a) | 0 (a) | (0,2)
 (0,3) | normal | 3671     | 0 (a) | (0,3)
(3 rows)

αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž™αžΎαž„αž”αž“αŸ’αžαžƒαžΎαž‰αž‡αž½αžšαžŠαŸαž€αžŠαŸ‚αž›αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ„αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αŸ”

αž™αžΎαž„αž‡αž½αžŸαž‡αž»αž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ”

=> COMMIT;
=> SELECT xmin, xmax, * FROM t;
 xmin | xmax | id |  s  
------+------+----+-----
 3669 |    0 |  2 | FOO
 3671 |    0 |  4 | BAR
(2 rows)

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3669 (c) | 0 (a) | (0,1)
 (0,2) | normal | 3670 (a) | 0 (a) | (0,2)
 (0,3) | normal | 3671 (c) | 0 (a) | (0,3)
(3 rows)

αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž˜αžΎαž›β€‹αžƒαžΎαž‰β€‹αž™αŸ‰αžΆαž„β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αžαžΆβ€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž‡αžΆαž”αŸ‹β€‹αž‚αŸ’αž“αžΆβ€‹αž˜αžΆαž“β€‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–β€‹αž•αŸ’αž‘αžΆαž›αŸ‹β€‹αžαŸ’αž›αž½αž“αŸ”

αž…αŸ†αžŽαžΆαŸ†αžαžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž‡αžΆαž”αŸ‹αž‚αŸ’αž“αžΆαž˜αž·αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ SQL αž“αŸ„αŸ‡αž‘αŸ αž–αŸ„αž›αž‚αžΊαž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αž˜αžΈαžŠαŸ„αž™αž˜αž·αž“αž”αŸ†αž–αŸαž‰αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž”αžΆαž“αž‘αŸαŸ” αž™αž“αŸ’αžαž€αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž”αŸ’αžšαž™αŸ„αž›αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαž…αŸ†αžŽαž»αž…αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž€αŸαžŠαžΌαž…αž‡αžΆαž“αŸ…αž–αŸαž›αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž›αžΎαž€αž›αŸ‚αž„ PL/pgSQL αž“αž·αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž€αž˜αŸ’αžšαž“αž·αž„αž’αžŸαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ”

=> BEGIN;
BEGIN
=> BEGIN;
WARNING:  there is already a transaction in progress
BEGIN
=> COMMIT;
COMMIT
=> COMMIT;
WARNING:  there is no transaction in progress
COMMIT

αž€αŸ†αž αž»αžŸαž“αž·αž„αž’αžΆαžαžΌαž˜αž·αž…αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš

αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αŸ†αž αž»αžŸαž€αžΎαžαž‘αžΎαž„αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš? αž§αž‘αžΆαž αžšαžŽαŸαžŠαžΌαž…αž“αŸαŸ‡αŸ–

=> BEGIN;
=> SELECT * FROM t;
 id |  s  
----+-----
  2 | FOO
  4 | BAR
(2 rows)

=> UPDATE t SET s = repeat('X', 1/(id-4));
ERROR:  division by zero

αž€αŸ†αž αž»αžŸαž˜αž½αž™αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž› αž αžΎαž™αž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŽαžΆαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž‘αŸαŸ–

=> SELECT * FROM t;
ERROR:  current transaction is aborted, commands ignored until end of transaction block

αž αžΎαž™αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž’αŸ’αž“αž€αž–αŸ’αž™αžΆαž™αžΆαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αŸαžŠαŸ„αž™ PostgreSQL αž“αžΉαž„αžšαžΆαž™αž€αžΆαžšαžŽαŸαž’αŸ†αž–αžΈαž€αžΆαžšαž”αŸ„αŸ‡αž”αž„αŸ‹αŸ–

=> COMMIT;
ROLLBACK

αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž·αž“αž’αžΆαž…αž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αžšαžΆαž‡αŸαž™? αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαž€αŸ†αž αž»αžŸαž’αžΆαž…αž€αžΎαžαž‘αžΎαž„αžαžΆαž˜αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž’αžΆαž…αž…αžΌαž›αž‘αŸ…αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš - αž’αžΆαžαžΌαž˜αž·αž…αž“αŸƒαžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž€αŸαžŠαŸ„αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž–αžΆαž“αŸ” αžŠαžΌαž…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž˜αž½αž™αž‡αž½αžšαž˜αž»αž“αž–αŸαž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ–

=> SELECT * FROM heap_page('t',0);
 ctid  | state  |   xmin   | xmax  | t_ctid 
-------+--------+----------+-------+--------
 (0,1) | normal | 3669 (c) | 3672  | (0,4)
 (0,2) | normal | 3670 (a) | 0 (a) | (0,2)
 (0,3) | normal | 3671 (c) | 0 (a) | (0,3)
 (0,4) | normal | 3672     | 0 (a) | (0,4)
(4 rows)

αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž“αž·αž™αžΆαž™αžαžΆ psql αž˜αžΆαž“αžšαž”αŸ€αž”αž˜αž½αž™αžŠαŸ‚αž›αž“αŸ…αžαŸ‚αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αžŠαžΌαž…αž‡αžΆαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžšαž”αžŸαŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αžœαž·αž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αŸ”

=> set ON_ERROR_ROLLBACK on
=> BEGIN;
=> SELECT * FROM t;
 id |  s  
----+-----
  2 | FOO
  4 | BAR
(2 rows)

=> UPDATE t SET s = repeat('X', 1/(id-4));
ERROR:  division by zero

=> SELECT * FROM t;
 id |  s  
----+-----
  2 | FOO
  4 | BAR
(2 rows)

=> COMMIT;

αžœαžΆαž˜αž·αž“αž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αž˜αžΆαž“αž‘αŸαžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž“αŸαŸ‡ psql αž–αž·αžαž‡αžΆαžŠαžΆαž€αŸ‹αž…αŸ†αž“αž»αž…αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŠαŸ„αž™αž”αŸ’αžšαž™αŸ„αž›αž“αŸ…αž…αŸ†αž–αŸ„αŸ‡αž˜αž»αžαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αžΈαž˜αž½αž™αŸ— αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžœαž·αž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αŸ” αžšαž”αŸ€αž”αž“αŸαŸ‡αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž‘αŸ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαž»αž…αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ (αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž˜αž·αž“αžœαž·αž›αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αžšαž€αž–αž½αž€αžœαžΆ) αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαžŸαŸ”

αž€αžΆαžšαž”αž“αŸ’αžαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹