MVCC-3. เชถเชฌเซเชฆเชฎเชพเชณเชพ เช†เชตเซƒเชคเซเชคเชฟเช“

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชฎเซเชฆเซเชฆเชพเช“ เชชเชฐ เชตเชฟเชšเชพเชฐ เช•เชฐเซเชฏเซ‹ เช›เซ‡ เช‡เชจเซเชธเซเชฏเซเชฒเซ‡เชถเชจ, เช…เชจเซ‡ เชตเชฟเชถเซ‡ เชเช• เชชเซ€เช›เซ‡เชนเช  เช•เชฐเซ€ เชนเชคเซ€ เชจเซ€เชšเชพ เชธเซเชคเชฐเซ‡ เชกเซ‡เชŸเชพเชจเซเช‚ เช†เชฏเซ‹เชœเชจ. เช…เชจเซ‡ เช…เช‚เชคเซ‡ เช…เชฎเซ‡ เชธเซŒเชฅเซ€ เชฐเชธเชชเซเชฐเชฆ เชญเชพเช— เชชเชฐ เชชเชนเซ‹เช‚เชšเซเชฏเชพ - เชถเชฌเซเชฆเชฎเชพเชณเชพ เช†เชตเซƒเชคเซเชคเชฟเช“.

เชนเซ‡เชกเชฐ

เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เชนเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡เชฎ, เชฆเชฐเซ‡เช• เชชเช‚เช•เซเชคเชฟ เชเช•เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เช…เชจเซ‡เช• เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชฎเชพเช‚ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชเช• เชธเช‚เชธเซเช•เชฐเชฃ เช•เซ‹เชˆเช• เชฐเซ€เชคเซ‡ เชฌเซ€เชœเชพเชฅเซ€ เช…เชฒเช— เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช. เช† เชนเซ‡เชคเซ เชฎเชพเชŸเซ‡, เชฆเชฐเซ‡เช• เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เชฌเซ‡ เช—เซเชฃ เช›เซ‡ เชœเซ‡ เช† เชธเช‚เชธเซเช•เชฐเชฃเชจเซ€ เช•เซเชฐเชฟเชฏเชพเชจเซ‹ "เชธเชฎเชฏ" เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡ (xmin เช…เชจเซ‡ xmax). เช…เชตเชคเชฐเชฃเชฎเชพเช‚ - เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชธเชฎเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชคเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชเช• เชตเชฟเชถเซ‡เชท เชตเชงเชคเซ‹ เช•เชพเช‰เชจเซเชŸเชฐ เช›เซ‡. เช…เชจเซ‡ เช† เช•เชพเช‰เชจเซเชŸเชฐ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชจเช‚เชฌเชฐ เช›เซ‡.

(เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, เชตเชพเชธเซเชคเชตเชฟเช•เชคเชพ เชตเชงเซ เชœเชŸเชฟเชฒ เช›เซ‡: เช•เชพเช‰เชจเซเชŸเชฐเชจเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฌเซ€เชŸ เช•เซเชทเชฎเชคเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เชจเช‚เชฌเชฐ เชธเชคเชค เชตเชงเซ€ เชถเช•เชคเซ‹ เชจเชฅเซ€. เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เช เช‚เชกเซเช‚ เชฅเชˆ เชœเชˆเชถเซเช‚ เชคเซเชฏเชพเชฐเซ‡ เช…เชฎเซ‡ เช† เชตเชฟเช—เชคเซ‹เชจเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชœเซ‹เชˆเชถเซเช‚.)

เชœเซเชฏเชพเชฐเซ‡ เชชเช‚เช•เซเชคเชฟ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ xmin เช เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชจเช‚เชฌเชฐ เชชเชฐ เชธเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡เชฃเซ‡ INSERT เช†เชฆเซ‡เชถ เชœเชพเชฐเซ€ เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹, เช…เชจเซ‡ xmax เช–เชพเชฒเซ€ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชœเซเชฏเชพเชฐเซ‡ เช•เซ‹เชˆ เชชเช‚เช•เซเชคเชฟ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃเชจเซเช‚ xmax เชฎเซ‚เชฒเซเชฏ เชคเซ‡ เชตเซเชฏเชตเชนเชพเชฐเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชธเชพเชฅเซ‡ เชšเชฟเชนเซเชจเชฟเชค เชฅเชพเชฏ เช›เซ‡ เชœเซ‡เชฃเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เซเชฏเซเช‚ เชนเชคเซเช‚.

เชœเซเชฏเชพเชฐเซ‡ เชชเช‚เช•เซเชคเชฟ เช…เชชเชกเซ‡เชŸ เช†เชฆเซ‡เชถ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เช–เชฐเซ‡เช–เชฐ เชฌเซ‡ เช•เชพเชฎเช—เซ€เชฐเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡: เช•เชพเชขเซ€ เชจเชพเช–เซ‹ เช…เชจเซ‡ เชฆเชพเช–เชฒ เช•เชฐเซ‹. เชชเช‚เช•เซเชคเชฟเชจเซเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃ xmax เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‡เชฒ เชตเซเชฏเชตเชนเชพเชฐเชจเซ€ เชธเช‚เช–เซเชฏเชพเชจเซ€ เชฌเชฐเชพเชฌเชฐ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชœ เชถเชฌเซเชฆเชฎเชพเชณเชพเชจเซเช‚ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชชเช›เซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡; เชคเซ‡เชจเซเช‚ xmin เชฎเซ‚เชฒเซเชฏ เช…เช—เชพเช‰เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเชพ xmax เชฎเซ‚เชฒเซเชฏ เชธเชพเชฅเซ‡ เชเช•เชฐเซเชช เช›เซ‡.

xmin เช…เชจเซ‡ xmax เช•เซเชทเซ‡เชคเซเชฐเซ‹ เชชเช‚เช•เซเชคเชฟ เชธเช‚เชธเซเช•เชฐเชฃ เชนเซ‡เชกเชฐเชฎเชพเช‚ เชถเชพเชฎเซ‡เชฒ เช›เซ‡. เช† เช•เซเชทเซ‡เชคเซเชฐเซ‹ เช‰เชชเชฐเชพเช‚เชค, เชนเซ‡เชกเชฐเชฎเชพเช‚ เช…เชจเซเชฏ เชถเชพเชฎเซ‡เชฒ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡:

  • เช‡เชจเซเชซเซ‹เชฎเชพเชธเซเช• เช เชฌเชฟเชŸเซเชธเชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เช›เซ‡ เชœเซ‡ เช† เชธเช‚เชธเซเช•เชฐเชฃเชจเชพ เช—เซเชฃเชงเชฐเซเชฎเซ‹เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชจเชพ เช˜เชฃเชพ เชฌเชงเชพ เช›เซ‡; เช…เชฎเซ‡ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เชฎเซเช–เซเชฏ เชฎเซเชฆเซเชฆเชพเช“ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเชถเซเช‚.
  • ctid เช เชธเชฎเชพเชจ เชฒเชพเช‡เชจเชจเชพ เช†เช—เชฒเชพ, เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ€ เชฒเชฟเช‚เช• เช›เซ‡. เชธเซเชŸเซเชฐเซ€เช‚เช—เชจเชพ เชจเชตเซ€เชจเชคเชฎ, เชธเซŒเชฅเซ€ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃ เชฎเชพเชŸเซ‡, ctid เช เช† เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‹ เชœ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡. เชจเช‚เชฌเชฐเชฎเชพเช‚ เชซเซ‹เชฐเซเชฎ (x,y) เช›เซ‡, เชœเซเชฏเชพเช‚ x เช เชชเซ‡เชœ เชจเช‚เชฌเชฐ เช›เซ‡, y เช เชเชฐเซ‡เชฎเชพเช‚ เช‡เชจเซเชกเซ‡เช•เซเชธ เชจเช‚เชฌเชฐ เช›เซ‡.
  • เชจเชฒ เชฌเซ€เชŸเชฎเซ‡เชช - เช†เชชเซ‡เชฒ เชธเช‚เชธเซเช•เชฐเชฃเชจเชพ เชคเซ‡ เช•เซ‰เชฒเชฎเซเชธเชจเซ‡ เชšเชฟเชนเซเชจเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชจเชฒ เชฎเซ‚เชฒเซเชฏ (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)

เชšเชพเชฒเซ‹ เชชเซƒเชทเซเช เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เช“ เชœเซ‹เชˆเช. pageinspect เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซเช‚ 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 เชตเซเชฏเชตเชนเชพเชฐ เชชเซ‚เชฐเซเชฃ เชฅเชฏเซ‹ เช›เซ‡? เชœเซ‹ เชจเชนเชฟเช‚, เชคเซ‹ เชถเชฌเซเชฆเชฎเชพเชณเชพเชจเซเช‚ เชฌเชจเชพเชตเซ‡เชฒ เชธเช‚เชธเซเช•เชฐเชฃ เชฆเซƒเชถเซเชฏเชฎเชพเชจ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚.
    เช† เชคเชชเชพเชธ เช…เชจเซเชฏ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ‡ เชœเซ‹เชˆเชจเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เช‰เชฆเชพเชนเชฐเชฃเชจเซ€ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชฐเซ‹เช•เชเชฐเซ‡ เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡. เชคเซ‡ เชฌเชงเซ€ เชธเช•เซเชฐเชฟเชฏ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ€ เชธเซ‚เชšเชฟ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชฆเชฐเซ‡เช• เชฎเชพเชŸเซ‡ เชคเซ‡เชจเชพ เชตเชฐเซเชคเชฎเชพเชจ (เชธเช•เซเชฐเชฟเชฏ) เชตเซเชฏเชตเชนเชพเชฐเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฆเชฐเซเชถเชพเชตเซ‡เชฒ เช›เซ‡.
  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 hint เชฌเชฟเชŸ เชชเช‚เช•เซเชคเชฟ เชธเช‚เชธเซเช•เชฐเชฃ เชชเชฐ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. 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 เชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชชเซ‹เชˆเชจเซเชŸ เชธเชพเชšเชตเซ‹ (savepoint), เชœเซ‡ เชคเชฎเชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐเชจเชพ เชญเชพเช—เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชตเชฟเช•เซเชทเซ‡เชชเชฟเชค เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชฐเชฆ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เช† เช‰เชชเชฐเซ‹เช•เซเชค เชฐเซ‡เช–เชพเช•เซƒเชคเชฟเชฎเชพเช‚ เชฌเช‚เชงเชฌเซ‡เชธเชคเซเช‚ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชตเซเชฏเชตเชนเชพเชฐ เชคเซ‡เชจเชพ เชคเชฎเชพเชฎ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชธเซเชฅเชฟเชคเชฟ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชญเซŒเชคเชฟเช• เชฐเซ€เชคเซ‡ เช•เซ‹เชˆ เชกเซ‡เชŸเชพ เชฐเซ‹เชฒเชฌเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ‹ เชจเชฅเซ€.

เช† เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡, เชธเซ‡เชตเชชเซ‹เช‡เชจเซเชŸ เชธเชพเชฅเซ‡เชจเชพ เชตเซเชฏเชตเชนเชพเชฐเชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช…เชฒเช—เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชจเซ‡เชธเซเชŸเซ‡เชก เชตเซเชฏเชตเชนเชพเชฐเซ‹ (เชธเชฌเชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ), เชœเซ‡เชจเซเช‚ เชธเซเชŸเซ‡เชŸเชธ เช…เชฒเช—เชฅเซ€ เชฎเซ‡เชจเซ‡เชœ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชจเซ‡เชธเซเชŸเซ‡เชก เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ‹ เชชเซ‹เชคเชพเชจเซ‹ เชจเช‚เชฌเชฐ เชนเซ‹เชฏ เช›เซ‡ (เชฎเซเช–เซเชฏ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ€ เชธเช‚เช–เซเชฏเชพ เช•เชฐเชคเชพ เชตเชงเชพเชฐเซ‡). เชจเซ‡เชธเซเชŸเซ‡เชก เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเซเชธเชจเซ€ เชธเซเชฅเชฟเชคเชฟ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹