เดŽเด‚เดตเดฟเดธเดฟเดธเดฟ-3. เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดชเดคเดฟเดชเตเดชเตเด•เตพ

เด…เดคเดฟเดจเดพเตฝ, เด‡เดคเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดžเด™เตเด™เตพ เดชเดฐเดฟเด—เดฃเดฟเดšเตเดšเต เด‡เตปเดธเตเดฒเต‡เดทเตป, เด•เตเดฑเดฟเดšเตเดšเต เด’เดฐเต เดชเดฟเดจเตเดฎเดพเดฑเตเดฑเด‚ เดจเดŸเดคเตเดคเดฟ เด•เตเดฑเดžเตเดž เดคเดฒเดคเตเดคเดฟเตฝ เดกเดพเดฑเตเดฑ เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดŸเตเดตเดฟเตฝ เดžเด™เตเด™เตพ เดเดฑเตเดฑเดตเตเด‚ เดฐเดธเด•เดฐเดฎเดพเดฏ เดญเดพเด—เดคเตเดคเดฟเดฒเต†เดคเตเดคเดฟ - เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดชเดคเดฟเดชเตเดชเตเด•เตพ.

เดนเต†เดกเตเดกเตผ

เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดชเดฑเดžเตเดžเดคเตเดชเต‹เดฒเต†, เด“เดฐเต‹ เดตเดฐเดฟเดฏเตเด‚ เด’เดฐเต‡เดธเดฎเดฏเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต† เดจเดฟเดฐเดตเดงเดฟ เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเด‚. เด’เดฐเต เดชเดคเดฟเดชเตเดชเต เดŽเด™เตเด™เดจเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดฑเตเดฑเตŠเดจเตเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต. เดˆ เด†เดตเดถเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เด“เดฐเต‹ เดชเดคเดฟเดชเตเดชเดฟเดจเตเด‚ เดˆ เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† (xmin, xmax) เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† "เดธเดฎเดฏเด‚" เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจ เดฐเดฃเตเดŸเต เด…เดŸเดฏเดพเดณเด™เตเด™เดณเตเดฃเตเดŸเต. เด‰เดฆเตเดงเดฐเดฃเดฟเด•เดณเดฟเตฝ - เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดธเดฎเดฏเดฎเดฒเตเดฒ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต, เดชเด•เตเดทเต‡ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดตเตผเดฆเตเดงเดฟเดšเตเดšเตเดตเดฐเตเดจเตเดจ เด•เต—เดฃเตเดŸเตผ. เดˆ เด•เต—เดฃเตเดŸเดฑเดพเดฃเต เด‡เดŸเดชเดพเดŸเต เดจเดฎเตเดชเตผ.

(เดชเดคเดฟเดตเตเดชเต‹เดฒเต†, เดฏเดพเดฅเดพเตผเดคเตเดฅเตเดฏเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฃเต: เด•เต—เดฃเตเดŸเดฑเดฟเดจเตเดฑเต† เดชเดฐเดฟเดฎเดฟเดคเดฎเดพเดฏ เดฌเดฟเดฑเตเดฑเต เดถเต‡เดทเดฟ เด•เดพเดฐเดฃเด‚ เด‡เดŸเดชเดพเดŸเต เดจเดฎเตเดชเตผ เดŽเดฒเตเดฒเดพเดฏเตโ€Œเดชเตเดชเต‹เดดเตเด‚ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดพเตฝ เดซเตเดฐเต€เดธเดฟเด‚เด—เดฟเตฝ เดŽเดคเตเดคเตเดฎเตเดชเต‹เตพ เดžเด™เตเด™เตพ เดˆ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚.)

เด’เดฐเต เดตเดฐเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, INSERT เด•เดฎเดพเตปเดกเต เดจเตฝเด•เดฟเดฏ เด‡เดŸเดชเดพเดŸเต เดจเดฎเตเดชเดฑเดฟเดฒเต‡เด•เตเด•เต xmin เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเด‚, เด•เต‚เดŸเดพเดคเต† xmax เดถเต‚เดจเตเดฏเดฎเดพเดฏเดฟ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เดตเดฐเดฟ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† xmax เดฎเต‚เดฒเตเดฏเด‚ DELETE เดจเดŸเดคเตเดคเดฟเดฏ เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เดŽเดฃเตเดฃเด‚ เด•เตŠเดฃเตเดŸเต เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต.

เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดตเดฐเดฟ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฐเดฃเตเดŸเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดจเดŸเดคเตเดคเตเดจเตเดจเต: เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•, เดšเต‡เตผเด•เตเด•เตเด•. เดตเดฐเดฟเดฏเตเดŸเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดจเดŸเดคเตเดคเดฟเดฏ เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เดŽเดฃเตเดฃเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ xmax เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเต‡ เดธเตเดŸเตเดฐเดฟเด‚เด—เดฟเดจเตเดฑเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดชเดฟเดจเตเดจเต€เดŸเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต; เด…เดคเดฟเดจเตเดฑเต† xmin เดฎเต‚เดฒเตเดฏเด‚ เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† xmax เดฎเต‚เดฒเตเดฏเดตเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต.

xmin, xmax เดซเต€เตฝเดกเตเด•เตพ เดตเดฐเดฟ เดชเดคเดฟเดชเตเดชเต เดคเดฒเด•เตเด•เต†เดŸเตเดŸเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดˆ เดซเต€เตฝเดกเตเด•เตพเด•เตเด•เต เดชเตเดฑเดฎเต‡, เดคเดฒเด•เตเด•เต†เดŸเตเดŸเดฟเตฝ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฏเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต:

  • เดˆ เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจ เดฌเดฟเดฑเตเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดชเดฐเดฎเตเดชเดฐเดฏเดพเดฃเต infomask. เด…เดตเดฏเดฟเตฝ เดงเดพเดฐเดพเดณเด‚ เด‰เดฃเตเดŸเต; เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเดต เดžเด™เตเด™เตพ เด•เตเดฐเดฎเต‡เดฃ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด‚.
  • ctid เด…เดคเต‡ เดตเดฐเดฟเดฏเตเดŸเต† เด…เดŸเตเดคเตเดค, เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดฒเดฟเด™เตเด•เดพเดฃเต. เด’เดฐเต เดธเตเดŸเตเดฐเดฟเด‚เด—เดฟเดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏเดคเตเด‚ เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณเดคเตเดฎเดพเดฏ เดชเดคเดฟเดชเตเดชเดฟเดจเต, ctid เดˆ เดชเดคเดฟเดชเตเดชเดฟเดจเต† เดคเดจเตเดจเต† เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เดจเดฎเตเดชเดฑเดฟเดจเต เดซเต‹เด‚ (x,y) เด‰เดฃเตเดŸเต, เด‡เดตเดฟเดŸเต† x เดŽเดจเตเดจเดคเต เดชเต‡เดœเต เดจเดฎเตเดชเดฑเดพเดฃเต, y เดŽเดจเตเดจเดคเต เด…เดฑเต‡เดฏเดฟเดฒเต† เดธเต‚เดšเดฟเด• เดธเด‚เด–เตเดฏเดฏเดพเดฃเต.
  • null เดฌเดฟเดฑเตเดฑเตเดฎเดพเดชเตเดชเต - เด’เดฐเต เดถเต‚เดจเตเดฏ เดฎเต‚เดฒเตเดฏเด‚ (NULL) เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดคเดจเตเดจเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† เด† เดจเดฟเดฐเด•เดณเต† เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต. NULL เดŽเดจเตเดจเดคเต เดธเดพเดงเดพเดฐเดฃ เดกเดพเดฑเตเดฑเดพ เดคเดฐเด‚ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเดฟเตฝ เด’เดจเตเดจเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เด†เดŸเตเดฐเดฟเดฌเตเดฏเต‚เดŸเตเดŸเต เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เดฃเด‚.

เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต เดตเดณเดฐเต† เดตเดฒเตเดคเดพเดฃเต - เดตเดฐเดฟเดฏเตเดŸเต† เด“เดฐเต‹ เดชเดคเดฟเดชเตเดชเดฟเดจเตเด‚ เด•เตเดฑเดžเตเดžเดคเต 23 เดฌเตˆเดฑเตเดฑเตเด•เตพ, เด•เต‚เดŸเดพเดคเต† เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ NULL เดฌเดฟเดฑเตเดฑเตเดฎเดพเดชเตเดชเต เด•เดพเดฐเดฃเด‚ เด•เต‚เดŸเตเดคเตฝ. เดชเดŸเตเดŸเดฟเด• "เด‡เดŸเตเด™เตเด™เดฟเดฏเดคเต" เด†เดฃเต†เด™เตเด•เดฟเตฝ (เด…เดคเดพเดฏเดคเต, เด•เตเดฑเดšเตเดšเต เดจเดฟเดฐเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต), เด“เดตเตผเดนเต†เดกเต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดตเดฟเดตเดฐเด™เตเด™เดณเต‡เด•เตเด•เดพเตพ เด•เต‚เดŸเตเดคเตฝ เดŽเดŸเตเดคเตเดคเต‡เด•เตเด•เดพเด‚.

เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เดฐเตเด•เตเด•เตเด•

เด‡เตปเดธเต‡เตผเดทเตป เดฎเตเดคเตฝ เดฒเต‹-เดฒเต†เดตเตฝ เดธเตเดŸเตเดฐเดฟเด‚เด—เต เด“เดชเตเดชเดฑเต‡เดทเดจเตเด•เตพ เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต เดŽเดจเตเดจเต เดจเดฎเตเด•เตเด•เต เด…เดŸเตเดคเตเดคเดฑเดฟเดฏเดพเด‚.

เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ, เดฐเดฃเตเดŸเต เดจเดฟเดฐเด•เดณเตเด‚ เด…เดตเดฏเดฟเดฒเตŠเดจเตเดจเดฟเตฝ เด’เดฐเต เดธเต‚เดšเดฟเด•เดฏเตเด‚ เด‰เดณเตเดณ เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดŸเตเดŸเดฟเด• เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚:

=> 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 เดซเด‚เด—เตโ€Œเดทเตป เดชเต‹เดฏเดฟเดจเตเดฑเดฑเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดตเดฐเดฟ เดชเดคเดฟเดชเตเดชเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดตเดฟเดตเดฐเด™เตเด™เตพ เดจเต‡เดŸเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต:

=> 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

PostgreSQL-เดฒเต† เดนเต€เดชเตเดชเต เดŽเดจเตเดจ เดตเดพเด•เตเด•เต เดชเดŸเตเดŸเดฟเด•เด•เดณเต† เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•. เดˆ เดชเดฆเดคเตเดคเดฟเดจเตเดฑเต† เดฎเดฑเตเดฑเตŠเดฐเต เดตเดฟเดšเดฟเดคเตเดฐเดฎเดพเดฏ เด‰เดชเดฏเต‹เด—เดฎเดพเดฃเดฟเดคเต - เด’เดฐเต เด•เต‚เดฎเตเดชเดพเดฐเด‚ เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต เดกเดพเดฑเตเดฑ เด˜เดŸเดจ, เดชเดŸเตเดŸเดฟเด•เดฏเตเดฎเดพเดฏเดฟ เดชเตŠเดคเตเดตเดพเดฏเดฟ เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เด“เตผเดกเตผ เดšเต†เดฏเตเดค เดธเต‚เดšเดฟเด•เด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ "เดŽเดฒเตเดฒเดพเด‚ เด’เดฐเตเดฎเดฟเดšเตเดšเต เดŽเดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต" เดŽเดจเตเดจ เด…เตผเดคเตเดฅเดคเตเดคเดฟเดฒเดพเดฃเต เดˆ เดชเดฆเด‚ เด‡เดตเดฟเดŸเต† เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต.

เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เด’เดฐเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดซเด‚เด—เตเดทเตป เดกเดพเดฑเตเดฑ "เด‰เดณเตเดณเดคเตเดชเต‹เดฒเต†" เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป, เดžเด™เตเด™เตพ เดตเดฟเดตเดฐเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เด‚ เดฎเดพเดคเตเดฐเด‚ เด‰เดชเต‡เด•เตเดทเดฟเดšเตเดšเต เด…เดคเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเด‚:

=> 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 เดฌเดฟเดฑเตเดฑเตเด•เตพ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เดตเดฐเดฟ เดชเดคเดฟเดชเตเดชเต ctid เดซเต€เตฝเดกเต เด…เดคเต‡ เดตเดฐเดฟเดฏเต† เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเดฟเดจเตผเดคเตเดฅเด‚ เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เดจเดฟเดฒเดตเดฟเดฒเดฟเดฒเตเดฒ เดŽเดจเตเดจเดพเดฃเต.

xmax เดซเต€เตฝเดกเต เด’เดฐเต เดกเดฎเตเดฎเดฟ เดจเดฎเตเดชเตผ 0 เด•เตŠเดฃเตเดŸเต เดจเดฟเดฑเดžเตเดžเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เดตเดฐเดฟเดฏเตเดŸเต† เดˆ เดชเดคเดฟเดชเตเดชเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ, เด…เดคเต เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณเดคเดพเดฃเต. xmax_aborted เดฌเดฟเดฑเตเดฑเต เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เด‡เดŸเดชเดพเดŸเตเด•เตพ เดˆ เดจเดฎเตเดชเดฑเดฟเดฒเต‡เด•เตเด•เต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เดฟเดฒเตเดฒ.

เด‡เดŸเดชเดพเดŸเต เดจเดฎเตเดชเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเดฐ เดฌเดฟเดฑเตเดฑเตเด•เตพ เดšเต‡เตผเดคเตเดคเต เดตเดพเดฏเดจเดพเด•เตเดทเดฎเดค เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดšเตเดตเดŸเต เด•เต‚เดŸเดฟ เดŽเดŸเตเด•เตเด•เดพเด‚. เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดซเด‚เด—เตเดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚, เด•เดพเดฐเดฃเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดคเดตเดฃ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเด‚:

=> 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)

xmin, xmax เดŽเดจเตเดจเต€ เด•เดชเดŸ เดจเดฟเดฐเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดธเดฎเดพเดจเดตเตเด‚ เดŽเดจเตเดจเดพเตฝ เด•เดพเดฐเตเดฏเดฎเดพเดฏเดฟ เดตเดฟเดถเดฆเดฎเดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฏ เดตเดฟเดตเดฐเด™เตเด™เตพ เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดจเตเดจเต† เดฒเดญเดฟเด•เตเด•เตเด‚:

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

เดซเดฟเด•เตเดธเต‡เดทเตป

เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏเดพเตฝ, เดจเดฟเด™เตเด™เตพ เด…เดคเดฟเดจเตเดฑเต† เดจเดฟเดฒ เด“เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต - เด…เดคเต เดชเตเดฐเดคเดฟเดœเตเดžเดพเดฌเดฆเตเดงเดฎเดพเดฃเต†เดจเตเดจเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, XACT เดŽเดจเตเดจ เด’เดฐเต เด˜เดŸเดจ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต (เด’เดชเตเดชเด‚ เดชเดคเดฟเดชเตเดชเต 10-เดจเต เดฎเตเดฎเตเดชเต เด‡เดคเดฟเดจเต† CLOG (เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เดฒเต‹เด—เต) เดŽเดจเตเดจเต เดตเดฟเดณเดฟเดšเตเดšเดฟเดฐเตเดจเตเดจเต, เดˆ เดชเต‡เดฐเต เด‡เดชเตเดชเต‹เดดเตเด‚ เดตเดฟเดตเดฟเดง เดธเตเดฅเดฒเด™เตเด™เดณเดฟเตฝ เด•เดพเดฃเดพเด‚).

XACT เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เดพเดฑเตเดฑเดฒเต‹เด—เต เดชเดŸเตเดŸเดฟเด•เดฏเดฒเตเดฒ; PGDATA/pg_xact เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเดฒเต† เดซเดฏเดฒเตเด•เตพ เด‡เดตเดฏเดพเดฃเต. เด“เดฐเต‹ เด‡เดŸเดชเดพเดŸเดฟเดจเตเด‚ เด…เดตเตผเด•เตเด•เต เดฐเดฃเตเดŸเต เดฌเดฟเดฑเตเดฑเตเด•เตพ เด‰เดฃเตเดŸเต: เดชเตเดฐเดคเดฟเดฌเดฆเตเดงเดคเดฏเตเดณเตเดณเดคเตเด‚ เด…เดฒเดธเดฟเดชเตเดชเดฟเดšเตเดšเดคเตเด‚ - เดตเดฐเดฟ เดชเดคเดฟเดชเตเดชเต เดคเดฒเด•เตเด•เต†เดŸเตเดŸเดฟเดฒเต† เดชเต‹เดฒเต†. เดˆ เดตเดฟเดตเดฐเด™เตเด™เตพ เดธเต—เด•เดฐเตเดฏเดพเตผเดคเตเดฅเด‚ เดจเดฟเดฐเดตเดงเดฟ เดซเดฏเดฒเตเด•เดณเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต; เดซเตเดฐเต€เดธเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดžเด™เตเด™เตพ เดˆ เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เตเด‚. เดˆ เดซเดฏเดฒเตเด•เดณเตเดฎเดพเดฏเตเดณเตเดณ เดœเต‹เดฒเดฟ เดฎเดฑเตเดฑเต†เดฒเตเดฒเดพ เดซเดฏเดฒเตเด•เดณเต†เดฏเตเด‚ เดชเต‹เดฒเต† เดชเต‡เดœเต เดคเต‹เดฑเตเด‚ เดจเดŸเดคเตเดคเตเดจเตเดจเต.

เด…เดคเดฟเดจเดพเตฝ, XACT-เตฝ เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เดจเดŸเดคเตเดคเตเดฎเตเดชเต‹เตพ, เดˆ เด‡เดŸเดชเดพเดŸเดฟเดจเดพเดฏเดฟ เดชเตเดฐเดคเดฟเดฌเดฆเตเดงเดคเดฏเตเดณเตเดณ เดฌเดฟเดฑเตเดฑเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเด‚. เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต เด‡เดคเดพเดฃเต (เดžเด™เตเด™เตพ เด‡เดคเตเดตเดฐเต† เดชเตเดฐเต€-เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเด‚เด—เต เดฒเต‹เด—เดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚).

เดจเดฎเตเดฎเตพ เด‡เดชเตเดชเต‹เตพ เดจเต‹เด•เตเด•เดฟเดฏ เดชเดŸเตเดŸเดฟเด• เดชเต‡เดœเดฟเดฒเต‡เด•เตเด•เต เดฎเดฑเตเดฑเตŠเดฐเต เด‡เดŸเดชเดพเดŸเต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด…เดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดšเต‹เดฆเตเดฏเด™เตเด™เตพเด•เตเด•เต เด‰เดคเตเดคเดฐเด‚ เดจเตฝเด•เต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚.

  1. xmin เด‡เดŸเดชเดพเดŸเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเต‹? เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดธเตเดŸเตเดฐเดฟเด‚เด—เดฟเดจเตเดฑเต† เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดชเดคเดฟเดชเตเดชเต เดฆเตƒเดถเตเดฏเดฎเดพเด•เดฐเตเดคเต.
    เดฎเดฑเตเดฑเตŠเดฐเต เด˜เดŸเดจ เดจเต‹เด•เตเด•เดฟเดฏเดพเดฃเต เดˆ เดชเดฐเดฟเดถเต‹เดงเดจ เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต, เด…เดคเต เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดชเด™เตเด•เดฟเดŸเตเดŸ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดคเดฟเดจเต† ProcArray เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดฒเตเดฒเดพ เดธเดœเต€เดต เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด‡เดคเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด“เดฐเต‹เดจเตเดจเดฟเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ (เดธเดœเต€เดตเดฎเดพเดฏ) เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เดŽเดฃเตเดฃเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.
  2. เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏเดพเตฝ, เดชเดฟเดจเตเดจเต† เดŽเด™เตเด™เดจเต† - เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเต‹ เดฑเดฆเตเดฆเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเต‹? เดฑเดฆเตเดฆเดพเด•เตเด•เดฟเดฏเดพเตฝ, เดตเดฐเดฟ เดชเดคเดฟเดชเตเดชเตเด‚ เดฆเตƒเดถเตเดฏเดฎเดพเด•เดฐเตเดคเต.
    เด‡เดคเดพเดฃเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ XACT. เดชเด•เตเดทเต‡, XACT-เดจเตเดฑเต† เด…เดตเดธเดพเดจ เดชเต‡เดœเตเด•เตพ RAM-เตฝ เดฌเดซเดฑเตเด•เดณเดฟเตฝ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เด“เดฐเต‹ เดคเดตเดฃเดฏเตเด‚ XACT เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเต เด‡เดชเตเดชเต‹เดดเตเด‚ เดšเต†เดฒเดตเต‡เดฑเดฟเดฏเดคเดพเดฃเต. เด…เดคเดฟเดจเดพเตฝ, เดŸเตเดฐเดพเตปเดธเดพเด•เตเดทเตป เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดธเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดšเตเดšเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เด…เดคเต เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† xmin_committed, xmin_aborted เดฌเดฟเดฑเตเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเดชเตเดชเต†เดŸเตเด‚. เดˆ เดฌเดฟเดฑเตเดฑเตเด•เดณเดฟเตฝ เด’เดจเตเดจเต เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, 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 เดฌเดฟเดฑเตเดฑเต เดฎเดพเดฏเตโ€Œเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดธเดœเต€เดต เด‡เดŸเดชเดพเดŸเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ xmax-เดจเตเดฑเต† เดธเต†เดฑเตเดฑเต เดฎเต‚เดฒเตเดฏเด‚ เด’เดฐเต เดฑเต‹ เดฒเต‹เด•เตเด•เดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•. เดฎเดฑเตเดฑเตŠเดฐเต เด‡เดŸเดชเดพเดŸเดฟเดจเต เดˆ เดตเดฐเดฟ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเต‹ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเดจเต‹ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด‡เดŸเดชเดพเดŸเต xmax เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเดจเตเดจเดคเตเดตเดฐเต† เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เด…เดคเต เดจเดฟเตผเดฌเดจเตเดงเดฟเดคเดฐเดพเด•เตเด‚. เดคเดŸเดฏเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดชเดฟเดจเตเดจเต€เดŸเต เด•เต‚เดŸเตเดคเตฝ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเด‚. เด‡เดชเตเดชเต‹เตพ, เดตเดฐเดฟ เดฒเต‹เด•เตเด•เตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดชเดฐเดฟเดงเดฟเดฏเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดพเดฃเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดต เดฑเดพเดฎเดฟเตฝ เด‡เดŸเด‚ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเตเดฐเด•เดŸเดจเด‚ เด…เดตเดฐเตเดŸเต† เดจเดฎเตเดชเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ. เดถเดฐเดฟเดฏเดพเดฃเต, "เดฆเต€เตผเด˜เดฎเดพเดฏ" เด‡เดŸเดชเดพเดŸเตเด•เตพเด•เตเด•เต เดฎเดฑเตเดฑเต เดฆเต‹เดทเด™เตเด™เดณเตเดฎเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เด•เต‚เดŸเตเดคเตฝ.

เดจเดฎเตเด•เตเด•เต เดฒเตˆเตป เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเด‚.

=> 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 เดฌเดฟเดฑเตเดฑเต เดฎเดพเดฏเตโ€Œเดšเตเดšเต.

เดฒเตˆเดจเดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดชเดคเดฟเดชเตเดชเต เด‡เดชเตเดชเต‹เตพ เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต (t_ctid เดซเต€เตฝเดกเต) เดชเตเดคเดฟเดฏเดคเดพเดฏเดฟ เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดธเต‚เดšเดฟเด• เดธเต‚เดšเดฟเด• เดชเต‡เดœเดฟเตฝ เดฆเตƒเดถเตเดฏเดฎเดพเด•เตเดจเตเดจเต, เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดตเดฐเดฟ เดชเดŸเตเดŸเดฟเด• เดชเต‡เดœเดฟเดฒเต† เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดชเดคเดฟเดชเตเดชเดฟเดจเต† เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจเต.

เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเดคเต เดชเต‹เดฒเต† เดคเดจเตเดจเต†, เดตเดฐเดฟเดฏเตเดŸเต† เด†เดฆเตเดฏ เดชเดคเดฟเดชเตเดชเดฟเดฒเต† xmax เดฎเต‚เดฒเตเดฏเด‚, เดตเดฐเดฟ เดฒเต‹เด•เตเด•เต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เดธเต‚เดšเดจเดฏเดพเดฃเต.

เดถเดฐเดฟ, เดจเดฎเตเด•เตเด•เต เด‡เดŸเดชเดพเดŸเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดพเด‚.

=> COMMIT;

เดธเต‚เดšเดฟเด•เด•เตพ

เด‡เดคเตเดตเดฐเต† เดจเดฎเตเดฎเตพ เดŸเต‡เดฌเดฟเตพ เดชเต‡เดœเตเด•เดณเต† เด•เตเดฑเดฟเดšเตเดšเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดธเด‚เดธเดพเดฐเดฟเดšเตเดšเดคเต. เดธเต‚เดšเดฟเด•เด•เตพเด•เตเด•เตเดณเตเดณเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต?

เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดคเดฐเด‚ เดธเต‚เดšเดฟเด•เดฏเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต เดธเต‚เดšเดฟเด• เดชเต‡เดœเตเด•เดณเดฟเดฒเต† เดตเดฟเดตเดฐเด™เตเด™เตพ เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเต†เดŸเตเดจเตเดจเต. เด’เดฐเต เดคเดฐเด‚ เดธเต‚เดšเดฟเด•เดฏเดฟเตฝ เดชเต‹เดฒเตเด‚ เดตเตเดฏเดคเตเดฏเดธเตเดค เดคเดฐเด‚ เดชเต‡เดœเตเด•เตพ เด‰เดฃเตเดŸเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด’เดฐเต เดฌเดฟ-เดŸเตเดฐเต€เดฏเดฟเตฝ เด’เดฐเต เดฎเต†เดฑเตเดฑเดพเดกเดพเดฑเตเดฑ เดชเต‡เดœเตเด‚ "เดชเดคเดฟเดตเต" เดชเต‡เดœเตเด•เดณเตเด‚ เด‰เดฃเตเดŸเต.

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเต‡เดœเดฟเตฝ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดตเดฐเดฟเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดตเดฐเดฟเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดชเต‹เดฏเดฟเดจเตเดฑเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐเดฏเตเดฃเตเดŸเต (เด’เดฐเต เดชเดŸเตเดŸเดฟเด• เดชเต‡เดœเต เดชเต‹เดฒเต†). เด•เต‚เดŸเดพเดคเต†, เดชเต‡เดœเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจเด‚ เดชเตเดฐเดคเตเดฏเต‡เด• เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เต เด‡เดŸเดฎเตเดฃเตเดŸเต.

เดธเต‚เดšเดฟเด•เดฏเดฟเดฒเต† เดตเดฐเดฟเด•เตพเด•เตเด•เต เดธเต‚เดšเดฟเด•เดฏเตเดŸเต† เดคเดฐเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดตเดณเดฐเต† เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เด˜เดŸเดจเด•เดณเตเด‚ เด‰เดฃเตเดŸเดพเด•เดพเด‚. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด’เดฐเต เดฌเดฟ-เดŸเตเดฐเต€เดฏเตเดŸเต†, เดฒเต€เดซเต เดชเต‡เดœเตเด•เดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดตเดฐเดฟเด•เดณเดฟเตฝ เด‡เตปเดกเต†เด•เตเดธเดฟเด‚เด—เต เด•เต€ เดฎเต‚เดฒเตเดฏเดตเตเด‚ เด…เดจเตเดฌเดจเตเดง เดชเดŸเตเดŸเดฟเด• เดจเดฟเดฐเดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดฑเดซเดฑเตปเดธเตเด‚ (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-เตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดชเต‹เดฏเดฟเดจเตเดฑเตเด•เตพ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด• (เดธเต‡เดตเตเดชเต‹เดฏเดฟเดจเตเดฑเต), เด‡เดคเต เด’เดฐเต เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดคเต† เดคเดจเตเดจเต† เดฑเดฆเตเดฆเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เดกเดฏเด—เตเดฐเดพเดฎเตเดฎเดพเดฏเดฟ เดฏเต‹เดœเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เด‡เดŸเดชเดพเดŸเดฟเดจเต เด…เดคเดฟเดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เตพเด•เตเด•เตเด‚ เด’เดฐเต‡ เดจเดฟเดฒเดฏเตเดฃเตเดŸเต, เด•เต‚เดŸเดพเดคเต† เดญเต—เดคเดฟเด•เดฎเดพเดฏเดฟ เด’เดฐเต เดกเดพเดฑเตเดฑเดฏเตเด‚ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดฟเดฒเตเดฒ.

เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ, เด’เดฐเต เดธเต‡เดตเต เดชเต‹เดฏเดฟเดจเตเดฑเต เด‰เดณเตเดณ เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เดชเดฒ เดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต เดจเต†เดธเตเดฑเตเดฑเดกเต เด‡เดŸเดชเดพเดŸเตเด•เตพ (เดธเดฌเตเดŸเตเดฐเดพเตปเดธเด•เตเดทเตป), เด‡เดคเดฟเดจเตเดฑเต† เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดธเต เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต.

เดจเต†เดธเตเดฑเตเดฑเดกเต เด‡เดŸเดชเดพเดŸเตเด•เตพเด•เตเด•เต เด…เดตเดฐเตเดŸเต‡เดคเดพเดฏ เดจเดฎเตเดชเตผ เด‰เดฃเตเดŸเต (เดชเตเดฐเดงเดพเดจ เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เดŽเดฃเตเดฃเดคเตเดคเต‡เด•เตเด•เดพเตพ เด‰เดฏเตผเดจเตเดจเดคเต). เดจเต†เดธเตเดฑเตเดฑเดกเต เด‡เดŸเดชเดพเดŸเตเด•เดณเตเดŸเต† เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดธเต XACT-เตฝ เดธเดพเดงเดพเดฐเดฃ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดฐเต‡เด–เดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เด…เดจเตเดคเดฟเดฎ เดจเดฟเดฒ เดชเตเดฐเดงเดพเดจ เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เดจเดฟเดฒเดฏเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต: เด…เดคเต เดฑเดฆเตเดฆเดพเด•เตเด•เดฟเดฏเดพเตฝ, เดŽเดฒเตเดฒเดพ เดจเต†เดธเตเดฑเตเดฑเดกเต เด‡เดŸเดชเดพเดŸเตเด•เดณเตเด‚ เดฑเดฆเตเดฆเดพเด•เตเด•เดชเตเดชเต†เดŸเตเด‚.

เด‡เดŸเดชเดพเดŸเต เดจเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดตเดฐเด™เตเด™เตพ PGDATA/pg_subtrans เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเดฒเต† เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. XACT เดฌเดซเดฑเตเด•เดณเตเดŸเต† เด…เดคเต‡ เดฐเต€เดคเดฟเดฏเดฟเตฝ เด“เตผเด—เดจเตˆเดธเตเดšเต†เดฏเตโ€Œเดค เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดชเด™เตเด•เดฟเดŸเตเดŸ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต† เดฌเดซเดฑเตเด•เดณเดฟเดฒเต‚เดŸเต† เดซเดฏเดฒเตเด•เตพ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เดจเต†เดธเตเดฑเตเดฑเดกเต เด‡เดŸเดชเดพเดŸเตเด•เดณเตเด‚ เดธเตเดตเดฏเด‚เดญเดฐเดฃ เด‡เดŸเดชเดพเดŸเตเด•เดณเตเด‚ เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเด•เตเด•เดฐเตเดคเต. เดธเตเดตเดฏเด‚เดญเดฐเดฃ เด‡เดŸเดชเดพเดŸเตเด•เตพ เด’เดฐเต เดคเดฐเดคเตเดคเดฟเดฒเตเด‚ เดชเดฐเดธเตเดชเดฐเด‚ เด†เดถเตเดฐเดฏเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ เดจเต†เดธเตเดฑเตเดฑเดกเต เด‡เดŸเดชเดพเดŸเตเด•เตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดชเดคเดฟเดตเต PostgreSQL-เตฝ เดธเตเดตเดฏเด‚เดญเดฐเดฃ เด‡เดŸเดชเดพเดŸเตเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เด’เดฐเตเดชเด•เตเดทเต‡, เดเดฑเตเดฑเดตเตเด‚ เดฎเดฟเด•เดšเตเดšเดคเต: เด…เดต เดตเดณเดฐเต† เด…เดชเต‚เตผเดตเดฎเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเต‡ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเต‚, เดฎเดฑเตเดฑเต DBMS-เด•เดณเดฟเดฒเต† เด…เดตเดฐเตเดŸเต† เดธเดพเดจเตเดจเดฟเดงเตเดฏเด‚ เดฆเตเดฐเตเดชเดฏเต‹เด—เดคเตเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต, เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เด•เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เดจเดฎเตเด•เตเด•เต เดชเดŸเตเดŸเดฟเด• เดฎเดพเดฏเตเด•เตเด•เดพเด‚, เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เด†เดฐเด‚เดญเดฟเดšเตเดšเต เดตเดฐเดฟ เดคเดฟเดฐเตเด•เตเด•:

=> 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•