แแกแ แ แแ, แฉแแแ แแแแแแฎแแแแ แกแแแแแฎแแแ
แกแแแแฃแ แ
แ แแแแ แช แฃแแแ แแแฅแแแ, แแแแแแฃแแ แแฌแแ แแแ แจแแแซแแแแ แแ แแแ แแฃแแแ แ แแแแแแแแ แแแ แกแแแจแ แแ แกแแแแแแแก แแแแแชแแแแ แแแแแจแ. แแ แแ แแแ แกแแ แ แแแแ แแ แฃแแแ แแแแแแกแฎแแแแแ แแแแ แแกแแแ, แแ แแแแแแ แแแแแแฃแ แแแ แกแแแก แแฅแแก แแ แ แแแจแแแ, แ แแแแแแช แแแแกแแแฆแแ แแแก แแ แแแ แกแแแก แแแฅแแแแแแแก โแแ แแกโ (xmin แแ xmax). แแ แญแงแแแแแจแ - แแแแขแแ, แ แแ แแแแแแงแแแแแ แแ แ แแ แ, แ แแแแ แช แแกแแแ, แแ แแแแ แกแแแชแแแแฃแ แ แแแแ แแ แแ แแชแฎแแแแ. แแ แแก แแ แแชแฎแแแแ แแ แแก แแแ แแแแแแก แแแแแ แ.
(แฉแแแฃแแแแแกแแแแแ , แ แแแแแแ แฃแคแ แ แ แแฃแแแ: แขแ แแแแแฅแชแแแก แแแแแ แ แแฃแแแแแแ แแแ แแแแแแ แแแแ แแ แแชแฎแแแแแก แจแแแฆแฃแแฃแแ แแแขแแก แกแแแซแแแแ แแก แแแแ. แแแแ แแ แแ แแแขแแแแแก แแแขแแแฃแ แแ แแแแแแฎแแแแแ, แ แแแแกแแช แแแงแแแแแก แแแแแฆแแแ.)
แ แแแแกแแช แกแขแ แแฅแแแ แแฅแแแแแ, xmin แแแงแแแแแฃแแแ แขแ แแแแแฅแชแแแก แแแแแ แแ, แ แแแแแแแช แแแกแชแ INSERT แแ แซแแแแแ แแ xmax แ แฉแแแ แชแแ แแแแ.
แ แแแแกแแช แแฌแแ แแแ แฌแแแจแแแแ, แแแแแแแแ แ แแแ แกแแแก xmax แแแแจแแแแแแแ แแฆแแแแจแแแแ แขแ แแแแแฅแชแแแก แแแแ แแ, แ แแแแแแแช แจแแแกแ แฃแแ DELETE.
แ แแแแกแแช แแฌแแ แแแ แแชแแแแแ UPDATE แแ แซแแแแแแ, แ แแแแฃแ แแ แจแแกแ แฃแแแแฃแแแ แแ แ แแแแ แแชแแ: DELETE แแ INSERT. แ แแแแก แแแแแแแแ แ แแแ แกแแ แแแแแแก xmax แขแ แแแแแฅแชแแแก แ แแแแแแแแแก แขแแแก, แ แแแแแแแช แแแแแฎแแแ. แจแแแแแ แแฅแแแแแ แแแแแ แกแขแ แแฅแแแแก แแฎแแแ แแแ แกแแ; แแแกแ xmin แแแแจแแแแแแแ แแแแฎแแแแ แฌแแแ แแแ แกแแแก xmax แแแแจแแแแแแแแก.
xmin แแ xmax แแแแแแ แจแแแแก แแฌแแ แแแแก แแแ แกแแแก แกแแแแฃแ แจแ. แแ แแแแแแแก แแแ แแ, แกแแแแฃแ แ แจแแแชแแแก แกแฎแแ แแแแแแก, แแแแแแแแแ:
- infomask แแ แแก แแแขแแแแก แกแแ แแ, แ แแแแแแช แแแแกแแแฆแแ แแแก แแ แแแ แกแแแก แแแแกแแแแแก. แแกแแแ แกแแแแแแ แแแแ แแ; แฉแแแ แแแแแแแแ แแแแแแฎแแแแแ แแแแแแ แแแก.
- ctid แแ แแก แแแฃแแ แแแแแ แฎแแแแก แจแแแแแแ, แฃแคแ แ แแฎแแแ แแแ แกแแแกแแแ. แกแขแ แแฅแแแแก แฃแแฎแแแกแ, แฃแแฎแแแกแ แแแ แกแแแกแแแแก ctid แแฎแแแ แแแแแ แแ แแแ แกแแแก. แ แแชแฎแแก แแฅแแก แคแแ แแ (x,y), แกแแแแช x แแ แแก แแแแ แแแก แแแแแ แ, y แแ แแก แแแแแฅแกแแก แแแแแ แ แแแกแแแจแ.
- null bitmap - แแฆแแแจแแแแก แแแชแแแฃแแ แแแ แกแแแก แแ แกแแแขแแแก, แ แแแแแแแช แจแแแชแแแก 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)
แแแแแ แจแแแฎแแแแ แแแแ แแแก แจแแแแแ แกแก. 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
แแแแแแแแแกแฌแแแแ, แ แแ แกแแขแงแแ heap 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-แจแ, แฉแแแแแแแ แแแขแ แแแงแแแแแฃแแแ แแ แขแ แแแแแฅแชแแแกแแแแก. แแ แแก แแ แแก แงแแแแแคแแ แ, แ แแช แฎแแแแ แฉแแแแแแก แแ แแก (แแฃแแชแ แฏแแ แแ แแกแแฃแแ แแแ แฌแแแแกแฌแแ แฉแแฌแแ แแก แแฃแ แแแแแ).
แ แแแแกแแช แกแฎแแ แขแ แแแแแฅแชแแ แฌแแแแแ แชแฎแ แแแแก แแแแ แแก, แ แแแแแกแแช แแฎแแแฎแแ แจแแแฎแแแแ, แแแก แแแฃแฌแแแก แ แแแแแแแแ แแแแฎแแแแ แแแกแฃแฎแแก แแแชแแแ.
- แแแกแ แฃแแแ xmin แขแ แแแแแฅแชแแ? แแฃ แแ แ, แแแจแแ แกแขแ แแฅแแแแก แจแแฅแแแแแ แแแ แกแแ แแ แฃแแแ แแงแแก แฎแแแฃแแ.
แแก แจแแแแฌแแแแ แฎแแ แชแแแแแแแ แกแฎแแ แกแขแ แฃแฅแขแฃแ แแก แแแแแแแแแ แแแแ, แ แแแแแแช แแแแแแ แแแแก แแแกแขแแแชแแแก แกแแแ แแ แแแฎแกแแแ แแแแจแ แแ แแฌแแแแแ ProcArray. แแแ แจแแแชแแแก แงแแแแ แแฅแขแแฃแ แ แแ แแชแแกแแก แฉแแแแแแแแแแก แแ แแแแแแฃแแแ แแแแแแแแฃแแแ แแแกแ แแแแแแแแ แ (แแฅแขแแฃแ แ) แขแ แแแแแฅแชแแแก แแแแแ แ. - แแฃ แแแกแ แฃแแแแฃแแแ, แแแจแแ แ แแแแ - แฉแแแแแแ แแ แแแฃแฅแแแแแ? แแฃ แแแฃแฅแแแ, แแแจแแ แแฌแแ แแแแก แแแ แกแแแช แแ แฃแแแ แแงแแก แฎแแแฃแแ.
แแก แแ แแก แแฃแกแขแแ แแก, แ แแกแแแแกแแช แแ แแก 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 แแแกแ แฃแแแแแก. แแแแแแแแแก แจแแกแแฎแแ แแแฌแแ แแแแแแ แแแแแแแแแแแ แแแกแแฃแแ แแแ. แแฎแแ แฉแแแ แฃแแ แแแแ แแฆแแแแจแแแแ, แ แแ แ แแแแก แฉแแแแแขแแแแก แ แแแแแแแแ แจแแฃแแฆแฃแแแแแ. แแกแแแ แแ แแแแแแแแ แแแแแแก RAM-แจแ แแ แกแแกแขแแแแก แแฃแจแแแแ แแ แแแแแชแแแก แแแ แ แแแแแแแแแก. แแแ แแแแแ, โแแ แซแแโ แขแ แแแแแฅแชแแแแก แกแฎแแ แฃแแ แงแแคแแแ แแฎแแ แแแแแช แแฅแแก, แแแแ แแ แแแแแ แแแแแแแแแแแ.
แแแแแ แฌแแแจแแแแ แฎแแแ.
=> BEGIN;
=> DELETE FROM t;
=> SELECT txid_current();
txid_current
--------------
3665
(1 row)
แฉแแแ แแฎแแแแแ, แ แแ แขแ แแแแแฅแชแแแก แแแแแ แ แแฌแแ แแแ xmax แแแแจแ, แแแแ แแ แแแคแแ แแแชแแแก แแแขแแแ แแ แแ แแก แแแแแแแแฃแแ:
=> SELECT * FROM heap_page('t',0);
ctid | state | xmin | xmax | t_ctid
-------+--------+----------+------+--------
(0,1) | normal | 3664 (c) | 3665 | (0,1)
(1 row)
แแแฃแฅแแแแ
แชแแแแแแแแแแก แจแแฌแงแแแขแ แแฃแจแแแแก แฉแแแแแแก แแกแแแแกแแ, แแฎแแแแ XACT-แจแ แจแแฌแงแแแขแแแ แแแขแ แแแงแแแแแฃแแแ แขแ แแแแแฅแชแแแกแแแแก. แแแฃแฅแแแแ แแกแแแแแ แกแฌแ แแคแแ, แ แแแแ แช แฉแแแแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแ แซแแแแแแก แฃแฌแแแแแแ ROLLBACK, แชแแแแแแแแแ แแ แฎแแแแ แฃแแแ: แงแแแแแคแแ แ, แ แแกแ แจแแชแแแแช แแแแฎแแ แฎแ แขแ แแแแแฅแชแแแ แแแแแชแแแแ แแแแ แแแแแ, แฃแชแแแแแ แ แฉแแแ.
=> ROLLBACK;
=> SELECT * FROM heap_page('t',0);
ctid | state | xmin | xmax | t_ctid
-------+--------+----------+------+--------
(0,1) | normal | 3664 (c) | 3665 | (0,1)
(1 row)
แแแแ แแแก แฌแแแแแแกแแก, แกแขแแขแฃแกแ แจแแแแฌแแแแแ แแ xmax_aborted แแแแแจแแแแ แแแขแ แแแงแแแแแแ แแฌแแ แแแแก แแแ แกแแแแ. แแแแแ xmax แแแแแ แ แ แฉแแแ แแแแ แแแ, แแแแ แแ แแแก แแ แแแแ แแแฎแแแแแก.
=> SELECT * FROM t;
id | s
----+-----
1 | FOO
(1 row)
=> SELECT * FROM heap_page('t',0);
ctid | state | xmin | xmax | t_ctid
-------+--------+----------+----------+--------
(0,1) | normal | 3664 (c) | 3665 (a) | (0,1)
(1 row)
แแแแแฎแแแแ
แแแแแฎแแแแ แแฃแจแแแแก แแกแ, แแแแฅแแก แแแ แฏแแ แฌแแจแแแ แ แแแแก แแแแแแแแ แ แแแ แกแแ แแ แจแแแแแ แฉแแกแแ แแฎแแแ.
=> BEGIN;
=> UPDATE t SET s = 'BAR';
=> SELECT txid_current();
txid_current
--------------
3666
(1 row)
แแแแฎแแแแ แแฌแแ แแแแแก แแ แ แฎแแแก (แแฎแแแ แแแ แกแแ):
=> SELECT * FROM t;
id | s
----+-----
1 | BAR
(1 row)
แแแแ แแ แแแแ แแแ แฉแแแ แแฎแแแแแ แแ แแแ แแแ แกแแแก:
=> SELECT * FROM heap_page('t',0);
ctid | state | xmin | xmax | t_ctid
-------+--------+----------+-------+--------
(0,1) | normal | 3664 (c) | 3666 | (0,2)
(0,2) | normal | 3666 | 0 (a) | (0,2)
(2 rows)
แฌแแจแแแแ แแแ แกแแ xmax แแแแจแ แแฆแแแแจแแแแ แแแแแแแแ แ แขแ แแแแแฅแชแแแก แแแแ แแ. แฃแคแ แ แแแขแแช, แแก แแแแจแแแแแแแ แแฌแแ แแแ แซแแแแแ, แ แแแแแ แฌแแแ แขแ แแแแแฅแชแแ แแแฃแฅแแแ. แแ xmax_aborted แแแขแ แแแกแฃแคแแแแแแฃแแแ, แ แแแแแ แแแแแแแแ แ แขแ แแแแแฅแชแแแก แกแขแแขแฃแกแ แฏแแ แแ แแ แแก แชแแแแแแ.
แฎแแแแก แแแ แแแแ แแแ แกแแ แแฎแแ แแแแฎแกแแแแแแก แแแแ แแก (t_ctid แแแแก), แ แแแแ แช แฃแคแ แ แแฎแแแก.
แแแแ แ แแแแแฅแกแ แแแแแฉแแแแแ แแแแแฅแกแแก แแแแ แแแ แแ แแแแ แ แ แแแ แแแฃแแแแแแก แแแแ แ แแแ แกแแแแ แชแฎแ แแแแก แแแแ แแแ.
แแกแแแ, แ แแแแ แช แฌแแจแแแก แจแแแแฎแแแแแจแ, แแฌแแ แแแแก แแแ แแแ แแแ แกแแแจแ xmax แแแแจแแแแแแแ แแแฃแแแแแแก, แ แแ แแฌแแ แแแ แแแแแแแแแแ.
แแแ, แแแแแกแ แฃแแแ แแแ แแแแแ.
=> COMMIT;
แแแแแฅแกแแแ
แแฅแแแแ แแฎแแแแ แชแฎแ แแแแก แแแแ แแแแแ แแแกแแฃแแ แแ. แ แ แฎแแแแ แแแแแฅแกแแแแก แจแแแแแ?
แแแแแฅแกแแก แแแแ แแแแแ แแแคแแ แแแชแแ แแแแจแแแแแแแแแ แแแแกแฎแแแแแแแ แแแแแฅแกแแก แแแแแ แแขแฃแแ แขแแแแก แแแฎแแแแแ. แแ แแฃแแแแช แแ แแ แขแแแแก แแแแแฅแกแก แแฅแแก แกแฎแแแแแกแฎแแ แขแแแแก แแแแ แแแแ. แแแแแแแแแ, B-แฎแแก แแฅแแก แแแขแแแแแแชแแแแแแก แแแแ แแ แแ โแฉแแแฃแแแแ แแแโ แแแแ แแแแ.
แแฃแแชแ, แแแแ แแก แฉแแแฃแแแแ แแ แแฅแแก แแฌแแ แแแแแแกแ แแ แแแแแ แ แแแแแแก แแแฉแแแแแแแแแแก แแแกแแแ (แแกแแแ, แ แแแแ แช แชแฎแ แแแแก แแแแ แแ). แแแ แแ แแแแกแ, แแแแ แแแก แแแแแก แแ แแก แแแแแแ แกแแแชแแแแฃแ แ แแแแแชแแแแแแกแแแแก.
แแแแแฅแกแแแจแ แแฌแแ แแแแแก แแกแแแ แจแแแซแแแแ แฐแฅแแแแแ แซแแแแแ แแแแกแฎแแแแแแฃแแ แกแขแ แฃแฅแขแฃแ แ, แ แแช แแแแแแแแแแฃแแแ แแแแแฅแกแแก แขแแแแ. แแแแแแแแแ, B-แฎแแกแแแแก, แคแฃแ แชแแแแแก แแแแ แแแแแแ แแแแแแจแแ แแแฃแแ แกแขแ แแฅแแแแแ แจแแแชแแแก แแแแแฅแกแแ แแแแก แแแกแแฆแแแแก แแแแจแแแแแแแแก แแ แแแแแแแแแก (ctid) แชแฎแ แแแแก แจแแกแแแแแแก แแฌแแ แแแแ. แแแแแแแ, แแแแแฅแกแ แจแแแซแแแแ แกแขแ แฃแฅแขแฃแ แแ แแแฃแแ แแงแแก แกแ แฃแแแแ แแแแกแฎแแแแแแฃแแ แแแแ.
แงแแแแแแ แแแแจแแแแแแแแแ แแก แแ แแก, แ แแ แแ แแ แกแแแแแก แแฌแแ แแแแก แแแ แกแแแแ แแแแแกแแแแ แ แขแแแแก แแแแแฅแกแแแจแ. แแแ แแแ, แแ แจแแแแแซแแแ แแแแแ แแฃแแแ, แ แแ แแแแแแฃแแ แฎแแแ แฌแแ แแแแแแแแแแ แแฃแกแขแแ แแ แแ แแแ แกแแแ. แกแฎแแ แกแแขแงแแแแแ แ แแ แแแฅแแแ, แแ แแ แแก xmin แแ xmax แแแแแแ แแแแแฅแกแแก แแฌแแ แแแแก แกแแแแฃแ แจแ. แฉแแแ แจแแแแแซแแแ แแแแแ แแฃแแแ, แ แแ แแแแแฅแกแแแแ แแแฃแแแแ แแแแงแแแแ แ แ แแแแแแก แชแฎแ แแแแก แงแแแแ แแแ แกแแแแแ - แแกแ แ แแ แแฅแแแ แจแแแแซแแแแ แแแแ แแแแแ, แแฃ แ แแแแ แแแ แกแแแก แแแแแแฎแแแก แขแ แแแแแฅแชแแ แแฎแแแแ แชแฎแ แแแแก แแแแแแแแแ แแแแ. (แ แแแแ แช แงแแแแแแแแก, แแก แแ แแ แแก แแแแแ แกแแแแ แแแ. แแแแแแ แ แจแแแแฎแแแแแจแ, แฎแแแแแแแแแก แ แฃแแแก แจแแฃแซแแแ แแ แแชแแกแแก แแแขแแแแแแชแแ, แแแแ แแ แแแแก แแแแแแแแแแแ แฃแคแ แ แแแขแแแฃแ แแ แแแแแแฎแแแแแ.)
แแแแแแ แแฃแแแ, แแแแแฅแกแแก แแแแ แแแ แแแแฃแแแแ แแ แแแ แแแ แกแแแก แแแแแแแแแแก, แ แแแแ แช แแแแแแแแแแแก, แแกแแแ แซแแแแก:
=> SELECT itemoffset, ctid FROM bt_page_items('t_s_idx',1);
itemoffset | ctid
------------+-------
1 | (0,2)
2 | (0,1)
(2 rows)
แแแ แขแฃแแแฃแ แ แขแ แแแแแฅแชแแแแ
แแ แแฅแขแแแแจแ, PostgreSQL แแงแแแแแก แแแขแแแแแแชแแแแก, แ แแแแแแแช แกแแจแฃแแแแแแก แแซแแแแก แแแก "แจแแแแฎแแก" แขแ แแแแแฅแชแแแก แแแแ แแแ.
แแฃ แขแ แแแแแฅแชแแ แแฎแแแแ แแแแแชแแแแแก แแแแฎแฃแแแแก, แแก แแ แแแฅแแแแแแก แแฌแแ แแแแก แแแ แกแแแแแก แฎแแแแแแแแแแ. แแแแขแแ, แกแแ แแแกแแก แแ แแชแแกแ แแแ แแแ แ แแแจแ แแแกแชแแแก แขแ แแแแแฅแชแแแก แแแ แขแฃแแแฃแ xid-แก. แแแแแ แ แจแแแแแแ แแ แแชแแกแแก ID แแ แ แแแแแ แแแแ แแกแแแ.
แแ แแแแ แแก แแแชแแแ แแ แกแแญแแ แแแแก แกแแแฅแ แแแแแแชแแแก แงแแแแ แแ แแชแแกแก แจแแ แแก แแ, แจแแกแแแแแแกแแ, แซแแแแแ แกแฌแ แแคแแ. แแแ แขแฃแแแฃแ แ แแแแ แแแแก แแแแแงแแแแแแก แแแแแ แแ แ แแแแแแก แแแงแแแแแแ แกแแฃแแ แแกแแก แแแแแชแแแแแ.
แแแ แขแฃแแแฃแ แ แแแแ แแแ แแ แแแแแ แแ แแ แแ แแก แแแแแแแแกแฌแแแแแฃแแ แแแแแชแแแแ แกแแแแจแแขแแแจแ.
แแ แแแก แกแฎแแแแแกแฎแแ แแแแแแขแจแ, แกแแกแขแแแแจแ แจแแแซแแแแ แแงแแก แแแ แขแฃแแแฃแ แ แขแ แแแแแฅแชแแแแ แฃแแแ แแแแแงแแแแแฃแแ แแแแ แแแแ แแ แแก แแแ แแแแฃแ แแ. แแแแ แแ แแกแแแ แ แแชแฎแแ แแ แจแแแซแแแแ แฉแแแฌแแ แแก แแแแแชแแแแ แแแแ แแแแแ, แ แแแแแ แแแแแแแแ แแแแ แแแ แฌแแแแแแกแแก แแแ แจแแแซแแแแ แแแแแ แแแก แแแแแ แแแแจแแแแแแแ.
=> 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-แจแ แแ แแ แกแแแแแก แแแขแแแแแแฃแ แ แขแ แแแแแฅแชแแแแ แแ, แแแแแ, แกแแฃแแแแแกแแ: แแกแแแ แกแแญแแ แแ แซแแแแแ, แซแแแแแ แแจแแแแแแ แแ แแแแ แงแแคแแ แกแฎแแ 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