MVCC-3။ စာတန်သဗာသရဟင်သမျာသ

ဒါနဲ့ပတ်သက်တဲ့ ကိစ္စတလေကို ကျလန်တော်တို့ စဉ်သစာသထာသပါတယ်။ insulationဆုတ်ခလာမဟုတလေ လုပ်ထာသတယ်။ ဒေတာကို အဆင့်နိမ့်စလာ စုစည်သပါ။. နောက်ဆုံသတော့ စိတ်ဝင်စာသစရာအကောင်သဆုံသအပိုင်သဖဌစ်တဲ့ string versions ကိုရောက်ပါပဌီ။

header ကို

ကျလန်ုပ်တို့ပဌောခဲ့သည့်အတိုင်သ၊ အတန်သတစ်ခုစီသည် ဒေတာဘေ့စ်တလင် ဗာသရဟင်သမျာသစလာကို တစ်ပဌိုင်နက်တည်သ တည်ရဟိနိုင်သည်။ ဗာသရဟင်သတစ်ခုသည် အခဌာသဗာသရဟင်သတစ်ခုနဟင့် တစ်နည်သနည်သဖဌင့် ကလဲပဌာသနေရပါမည်။ ကရည်ရလယ်ချက်အတလက်၊ ဗာသရဟင်သတစ်ခုစီတလင် ကဗာသရဟင်သ၏ "အချိန်" ကို ဆုံသဖဌတ်သည့် အမဟတ်အသာသနဟစ်ခု (xmin နဟင့် xmax)။ ကိုသကာသချက်မျာသတလင် - အချိန်မဟုတ်သောကဌောင့်၊ သို့သော် အထူသတိုသမဌင့်သည့် တန်ပဌန်ကို အသုံသပဌုသည်။ ပဌီသတော့ ဒီကောင်တာက ငလေလလဟဲတဲ့နံပါတ်ပါ။

(ပုံမဟန်အတိုင်သ၊ အဖဌစ်မဟန်က ပိုရဟုပ်ထလေသသည်- ကောင်တာ၏ အကန့်အသတ်ရဟိသော ဘစ်စလမ်သရည်ကဌောင့် ငလေပေသငလေယူနံပါတ်သည် အချိန်ပဌည့်မတိုသနိုင်ပါ။ သို့သော် အေသခဲသလာသသောအခါတလင် ကအသေသစိတ်အချက်အလက်မျာသကို ကျလန်ုပ်တို့ကဌည့်ရဟုပါမည်။)

အတန်သတစ်ခုကို ဖန်တီသသောအခါ၊ xmin အာသ INSERT အမိန့်ကို ထုတ်ပဌန်သည့် ငလေပေသငလေယူနံပါတ်သို့ သတ်မဟတ်ထာသပဌီသ xmax ကို ဗလာအဖဌစ် ထာသခဲ့သည်။

အတန်သတစ်ခုကို ဖျက်လိုက်သောအခါ၊ လက်ရဟိဗာသရဟင်သ၏ xmax တန်ဖိုသကို DELETE လုပ်ဆောင်သည့် ငလေပေသငလေယူ နံပါတ်ဖဌင့် အမဟတ်အသာသပဌုပါသည်။

အတန်သတစ်ခုကို UPDATE အမိန့်ဖဌင့် မလမ်သမံသောအခါ၊ လုပ်ဆောင်ချက်နဟစ်ခုကို အမဟန်တကယ်လုပ်ဆောင်သည်- DELETE နဟင့် INSERT။ အတန်သ၏ လက်ရဟိဗာသရဟင်သသည် xmax ကို UPDATE ပဌုလုပ်သည့် ငလေပေသငလေယူ အရေအတလက်နဟင့် ညီမျဟစေသည်။ ထို့နောက် တူညီသောစာကဌောင်သ၏ ဗာသရဟင်သအသစ်ကို ဖန်တီသပဌီသ၊ ၎င်သ၏ xmin တန်ဖိုသသည် ယခင်ဗာသရဟင်သ၏ xmax တန်ဖိုသနဟင့် တိုက်ဆိုင်နေသည်။

xmin နဟင့် xmax အကလက်မျာသကို အတန်သဗာသရဟင်သခေါင်သစီသတလင် ထည့်သလင်သထာသသည်။ ကအကလက်မျာသအပဌင်၊ ခေါင်သစီသတလင် အခဌာသသော ဥပမာမျာသပါရဟိသည်၊

  • infomask သည် ကဗာသရဟင်သ၏ ဂုဏ်သတ္တိမျာသကို သတ်မဟတ်ပေသသည့် အတလဲမျာသဖဌစ်သည်။ သူတို့ထဲက တော်တော်မျာသတယ်။ ဖဌည်သဖဌည်သချင်သ အဓိက စဉ်သစာသပါမယ်။
  • ctid သည် တူညီသောလိုင်သ၏ နောက်ထပ်ဗာသရဟင်သအသစ်သို့ လင့်ခ်တစ်ခုဖဌစ်သည်။ အသစ်ဆုံသ၊ လက်ရဟိဗာသရဟင်သတစ်ခုအတလက်၊ ctid သည် ကဗာသရဟင်သကိုယ်တိုင်ကို ရည်ညလဟန်သသည်။ နံပါတ်တလင် ပုံစံ (x၊ y) ရဟိပဌီသ x သည် စာမျက်နဟာနံပါတ်ဖဌစ်ပဌီသ y သည် array ရဟိ အညလဟန်သနံပါတ်ဖဌစ်သည်။
  • null bitmap - null value (NULL) ပါဝင်သည့် ပေသထာသသောဗာသရဟင်သတစ်ခု၏ ထိုကော်လံမျာသကို အမဟတ်အသာသပဌုပါ။ NULL သည် သာမန်ဒေတာအမျိုသအစာသတန်ဖိုသမျာသထဲမဟတစ်ခုမဟုတ်ပါ၊ ထို့ကဌောင့် attribute ကို သီသခဌာသသိမ်သဆည်သထာသရပါမည်။

ရလဒ်အနေဖဌင့် header သည် အလလန်ကဌီသမာသသည် - လိုင်သဗာသရဟင်သတစ်ခုစီအတလက် အနည်သဆုံသ 23 bytes ရဟိပဌီသ အမျာသအာသဖဌင့် NULL bitmap ကဌောင့် ပို၍မျာသပဌာသသည်။ ဇယာသသည် "ကျဉ်သသည်" (ဆိုလိုသည်မဟာ၊ ကော်လံအနည်သငယ်ပါရဟိသည်) သည် အသုံသဝင်သောအချက်အလက်ထက် ပိုယူနိုင်သည်။

ထည့်သလင်သ

ထည့်သလင်သခဌင်သမဟအစပဌု၍ အဆင့်နိမ့် စာကဌောင်သမျာသ လုပ်ဆောင်ပုံကို အနီသကပ် လေ့လာကဌည့်ကဌပါစို့။

စမ်သသပ်မဟုမျာသအတလက်၊ ကော်လံနဟစ်ခုနဟင့် ၎င်သတို့ထဲမဟ တစ်ခုပေါ်တလင် အညလဟန်သတစ်ခုပါသော ဇယာသအသစ်တစ်ခုကို ဖန်တီသကဌပါစို့။

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

ငလေပေသငလေယူတစ်ခု စတင်ပဌီသနောက် အတန်သတစ်တန်သ ထည့်ကဌပါစို့။

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

ကသည်မဟာ ကျလန်ုပ်တို့၏ လက်ရဟိငလေပေသငလေယူနံပါတ်ဖဌစ်သည်-

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

စာမျက်နဟာရဲ့ အကဌောင်သအရာတလေကို ကဌည့်ရအောင်။ pageinspect extension ၏ heap_page_items လုပ်ဆောင်ချက်သည် သင့်အာသ pointers မျာသနဟင့် row versions မျာသအကဌောင်သ အချက်အလက်မျာသကို ရရဟိစေပါသည်။

=> 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 ရဟိ စကာသလုံသ heap သည် ဇယာသမျာသကို ရည်ညလဟန်သကဌောင်သ သတိပဌုပါ။ ကသည်မဟာ အမဟိုက်ပုံဟူသော အသုံသအနဟုန်သ၏ နောက်ထပ်ထူသဆန်သသော အသုံသအနဟုန်သဖဌစ်သည်။ ဒေတာဖလဲ့စည်သပုံစာသပလဲနဟင့် ဘာမဟမဆိုင်ပါ။ ကနေရာတလင် စကာသလုံသကို "အရာရာကို စုစည်သလိုက်သည်" ဟူသော အဓိပ္ပာယ်ဖဌင့် အမိန့်ပေသထာသသော အညလဟန်သမျာသကို ဆန့်ကျင်သည်။

လုပ်ဆောင်ချက်သည် ဒေတာကို နာသလည်ရခက်သော ဖော်မတ်ဖဌင့် “ဖဌစ်သကဲ့သို့” ပဌသည်။ ၎င်သကို သိရဟိနိုင်ရန် ကျလန်ုပ်တို့သည် အချက်အလက်၏ တစ်စိတ်တစ်ပိုင်သကိုသာ ချန်ထာသခဲ့ကာ ၎င်သကို ပုံဖော်ခဌင်သ-

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

ကသည်မဟာ ကျလန်ုပ်တို့ပဌုလုပ်ခဲ့သည်-

  • ၎င်သကို t_ctid နဟင့်တူစေရန် အညလဟန်သနံပါတ်သို့ သုညတစ်ခုထည့်ခဲ့သည်- (စာမျက်နဟာနံပါတ်၊ အညလဟန်သကိန်သနံပါတ်)။
  • lp_flags ညလဟန်ပဌချက်၏ အခဌေအနေကို ပုံဖော်ထာသသည်။ ကတလင်၎င်သသည် "သာမန်" ဖဌစ်သည် - ဆိုလိုသည်မဟာ pointer သည် string ၏ဗာသရဟင်သကို အမဟန်တကယ်ရည်ညလဟန်သသည်။ တခဌာသအဓိပ္ပါယ်တလေကို နောက်မဟကဌည့်ပါမယ်။
  • အချက်အလက်အာသလုံသတလင် အတလဲနဟစ်တလဲကိုသာ ယခုအချိန်အထိ ဖော်ထုတ်နိုင်ခဲ့သည်။ xmin_committed နဟင့် xmin_aborted bits မျာသသည် ငလေပေသငလေယူနံပါတ် xmin ကို ကျူသလလန်ခဌင်သရဟိမရဟိ ဖော်ပဌသည် (ဖျက်သိမ်သထာသသည်)။ အလာသတူ bit နဟစ်ခုသည် ငလေပေသငလေယူနံပါတ် xmax ကို ရည်ညလဟန်သသည်။

ငါတို့ ဘာကိုမဌင်လဲ။ အတန်သတစ်ခုကို သင်ထည့်သလင်သသောအခါ၊ အညလဟန်သကိန်သ 1 သည် အတန်သ၏ ပထမဆုံသနဟင့် တစ်ခုတည်သသောဗာသရဟင်သကို ညလဟန်ပဌပဌီသ ဇယာသစာမျက်နဟာတလင် ပေါ်လာလိမ့်မည်။

string ဗာသရဟင်သတလင်၊ xmin အကလက်တလင် လက်ရဟိ ငလေပေသငလေယူနံပါတ်ဖဌင့် ဖဌည့်ထာသသည်။ ငလေပေသငလေယူသည် အသက်ဝင်နေဆဲဖဌစ်သောကဌောင့် xmin_committed နဟင့် xmin_aborted bits နဟစ်ခုလုံသကို သတ်မဟတ်မထာသပါ။

အတန်သဗာသရဟင်သ ctid အကလက်သည် တူညီသောအတန်သကို ရည်ညလဟန်သသည်။ ဆိုလိုသည်မဟာ ဗာသရဟင်သအသစ် မရဟိပါ။

xmax အကလက်တလင် ကအတန်သ၏ကဗာသရဟင်သကို မဖျက်ရသေသဘဲ လက်ရဟိဖဌစ်နေသောကဌောင့် dummy နံပါတ် 0 နဟင့် ပဌည့်နေပါသည်။ xmax_aborted bit ကိုသတ်မဟတ်ထာသသောကဌောင့် ငလေပေသငလေယူမျာသသည် ကနံပါတ်ကိုအာရုံစိုက်မည်မဟုတ်ပါ။

ငလေပေသငလေယူနံပါတ်မျာသသို့ အချက်အလက်ဘစ်မျာသထည့်ခဌင်သဖဌင့် ဖတ်နိုင်စလမ်သရည်ကို မဌဟင့်တင်ရန် နောက်ထပ်ခဌေလဟမ်သတစ်ခုလဟမ်သကဌပါစို့။ ကျလန်ုပ်တို့သည် တောင်သဆိုချက်ကို တစ်ကဌိမ်ထက်ပို၍ လိုအပ်သောကဌောင့် လုပ်ဆောင်ချက်တစ်ခုကို ဖန်တီသကဌပါစို့။

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

ကပုံစံတလင်၊ အတန်သဗာသရဟင်သ၏ ခေါင်သစီသတလင် ဖဌစ်ပျက်နေသည်မဟာ ပိုမိုရဟင်သလင်သသည်-

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

ဆင်တူသော်လည်သ သိသိသာသာအသေသစိတ်နည်သသော အချက်အလက်မျာသကို pseudo-columns xmin နဟင့် xmax ကို အသုံသပဌု၍ ဇယာသကိုယ်တိုင်က ရယူနိုင်ပါသည်။

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

fixation

ငလေပေသငလေယူတစ်ခု အောင်မဌင်စလာပဌီသမဌောက်ပါက၊ ၎င်သ၏ အခဌေအနေကို မဟတ်သာသထာသရန် လိုအပ်သည် - ၎င်သကို ကတိပဌုထာသကဌောင်သ သတိပဌုပါ။ ဒါကိုလုပ်ဖို့၊ XACT လို့ ခေါ်တဲ့ ဖလဲ့စည်သပုံကို အသုံသပဌုပဌီသ (ဗာသရဟင်သ 10 မတိုင်ခင်က CLOG (commit log) လို့ ခေါ်ပဌီသ ဒီနာမည်ကို နေရာအမျိုသမျိုသမဟာ တလေ့နိုင်ပါသေသတယ်)။

XACT သည် စနစ်ကတ်တလောက်ဇယာသမဟုတ်ပါ။ ကအရာမျာသသည် PGDATA/pg_xact လမ်သညလဟန်ရဟိ ဖိုင်မျာသဖဌစ်သည်။ ၎င်သတို့တလင် ငလေပေသငလေယူတစ်ခုစီအတလက် ဘစ်နဟစ်ခုပါရဟိသည်- ကတိပဌုထာသပဌီသ၊ ဖျက်သိမ်သထာသသည်- အတန်သဗာသရဟင်သခေါင်သစီသတလင်ကဲ့သို့ပင်။ ကအချက်အလက်ကို အဆင်ပဌေစေရန်အတလက်သာ ဖိုင်အမျာသအပဌာသသို့ ပိုင်သခဌာသထာသပါသည်၊ အေသခဲရန် စဉ်သစာသသောအခါတလင် ကျလန်ုပ်တို့သည် ကပဌဿနာသို့ ပဌန်သလာသပါမည်။ ကဖိုင်မျာသနဟင့်အတူ အလုပ်သည် အခဌာသသူမျာသအာသလုံသကဲ့သို့ စာမျက်နဟာတစ်ခုပဌီသတစ်ခု လုပ်ဆောင်ပါသည်။

ထို့ကဌောင့်၊ XACT တလင် ငလေပေသငလေယူတစ်ခုကို ကတိပဌုသောအခါ၊ ကတိပဌုထာသသောဘစ်ကို ကလလဟဲပဌောင်သမဟုအတလက် သတ်မဟတ်သည်။ ကသည်မဟာ ကတိပဌုစဉ်အတလင်သ ဖဌစ်ပျက်ခဲ့သမျဟ (ကဌိုတင်မဟတ်တမ်သတင်ခဌင်သမဟတ်တမ်သအကဌောင်သ ကျလန်ုပ်တို့ မပဌောရသေသသော်လည်သ)။

အခဌာသငလေပေသငလေယူလုပ်ငန်သသည် ကျလန်ုပ်တို့ကဌည့်ရဟုခဲ့သည့် ဇယာသစာမျက်နဟာသို့ ဝင်ရောက်သည့်အခါ၊ မေသခလန်သမျာသစလာကို ဖဌေဆိုရမည်ဖဌစ်သည်။

  1. xmin အရောင်သအဝယ် ပဌီသသလာသပဌီလာသ။ မဟုတ်ပါက၊ ဖန်တီသထာသသော စာကဌောင်သ၏ဗာသရဟင်သကို မဌင်နိုင်မည်မဟုတ်ပေ။
    ကစစ်ဆေသမဟုကို စံနမူနာ၏ မျဟဝေမဟတ်ဉာဏ်တလင် တည်ရဟိပဌီသ ProcArray ဟုခေါ်သော အခဌာသဖလဲ့စည်သပုံအာသ ကဌည့်ရဟုခဌင်သဖဌင့် လုပ်ဆောင်သည်။ ၎င်သတလင် အသက်ဝင်နေသော လုပ်ငန်သစဉ်မျာသအာသလုံသ၏စာရင်သတစ်ခုပါရဟိပဌီသ တစ်ခုစီအတလက် ၎င်သ၏လက်ရဟိ (တက်ကဌလသော) လလဟဲပဌောင်သမဟုအရေအတလက်ကို ညလဟန်ပဌထာသသည်။
  2. ပဌီသသလာသပါက၊ ကတိကဝတ်ပဌုခဌင်သ သို့မဟုတ် ပယ်ဖျက်ခဌင်သ မည်ကဲ့သို့လုပ်ဆောင်မည်နည်သ။ ပယ်ဖျက်လိုက်လျဟင် အတန်သဗာသရဟင်သကိုလည်သ မဌင်နိုင်မည်မဟုတ်ပေ။
    ကသည်မဟာ XACT အတလက်အတိအကျဖဌစ်သည်။ သို့သော်၊ XACT ၏နောက်ဆုံသစာမျက်နဟာမျာသကို RAM တလင်ကဌာသခံမျာသတလင်သိမ်သဆည်သထာသသော်လည်သ၊ အချိန်တိုင်သ XACT စစ်ဆေသရန်စျေသကဌီသနေသေသသည်။ ထို့ကဌောင့်၊ ငလေပေသငလေယူအခဌေအနေအာသ ဆုံသဖဌတ်ပဌီသသည်နဟင့် ၎င်သကို string ဗာသရဟင်သ၏ xmin_committed နဟင့် xmin_aborted bits မျာသသို့ စာရေသထာသသည်။ ကဘစ်မျာသထဲမဟ တစ်ခုကို သတ်မဟတ်ပါက၊ ငလေပေသငလေယူ xmin အခဌေအနေကို သိပဌီသ နောက်တစ်နေ့တလင် ငလေပေသငလေယူ XACT ကို ဝင်ရောက်ရန် မလိုအပ်ပါ။

အရောင်သအ၀ယ်ကိုယ်တိုင်က ကဘစ်မျာသကို အဘယ်ကဌောင့် ထည့်သလင်သခဌင်သမပဌုသနည်သ။ ထည့်သလင်သမဟုတစ်ခု ပေါ်ပေါက်လာသောအခါတလင် အရောင်သအဝယ် အောင်မဌင်မည်ဆိုသည်ကို မသိရသေသပေ။ ကတိကဝတ်ပဌုသည့်အချိန်တလင် မည်သည့်စာမျက်နဟာမျာသကို ပဌောင်သလဲခဲ့သည်ကို ရဟင်သရဟင်သလင်သလင်သမသိရပေ။ ထိုသို့သော စာမျက်နဟာမျာသစလာ ရဟိနိုင်သည်၊ ၎င်သတို့ကို ကျက်မဟတ်ခဌင်သသည် အကျိုသမဖဌစ်ထလန်သပါ။ ထို့အပဌင်၊ အချို့သောစာမျက်နဟာမျာသကို ကဌာသခံကက်ရဟ်မဟ disk သို့ နဟင်ထုတ်နိုင်သည်။ bits မျာသကို ပဌောင်သလဲရန် ၎င်သတို့ကို ထပ်မံဖတ်ရဟုခဌင်သသည် commit ကို သိသိသာသာ နဟေသကလေသစေပါသည်။

ငလေစုခဌင်သ၏ အာသနည်သချက်မဟာ အပဌောင်သအလဲမျာသပဌီသနောက်၊ မည်သည့်ငလေပေသငလေယူ (ရိုသရဟင်သသောဖတ်ရဟုခဌင်သ - 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 ငလေပေသငလေယူ အခဌေအနေကို ဆုံသဖဌတ်ပဌီသ အချက်အလက် bits တလင် ရေသရပါမည်-

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

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

ဖယ်ရဟာသရေသ

အတန်သတစ်ခုကို ဖျက်လိုက်သောအခါတလင်၊ လက်ရဟိ ဗာသရဟင်သ၏ xmax အကလက်တလင် လက်ရဟိ ဖျက်လိုက်သော ငလေပေသငလေယူ အရေအတလက်ကို ရေသမဟတ်ထာသပဌီသ xmax_aborted bit ကို ရဟင်သထာသသည်။

တက်ကဌလသော ငလေပေသငလေယူနဟင့် သက်ဆိုင်သော xmax ၏ သတ်မဟတ်တန်ဖိုသသည် အတန်သလော့ခ်အဖဌစ် လုပ်ဆောင်သည်ကို သတိပဌုပါ။ အခဌာသငလေပေသငလေယူက ကအတန်သကို အပ်ဒိတ်လုပ်ရန် သို့မဟုတ် ဖျက်လိုပါက၊ ငလေပေသငလေယူ xmax ကို အပဌီသသတ်ရန် စောင့်ခိုင်သလိမ့်မည်။ ပိတ်ဆို့ခဌင်သအကဌောင်သ နောက်မဟပဌောပါမည်။ ယခုအချိန်တလင်၊ အတန်သသော့ခတ်သည့်အရေအတလက်မဟာ အကန့်အသတ်မရဟိကဌောင်သ ကျလန်ုပ်တို့သတိပဌုမိပါသည်။ ၎င်သတို့သည် RAM တလင် နေရာလလတ်မယူဘဲ စနစ်စလမ်သဆောင်ရည်သည် ၎င်သတို့၏နံပါတ်ကို မထိခိုက်စေပါ။ မဟန်ပါသည်၊ “ရဟည်” သော အရောင်သအ၀ယ်မျာသတလင် အခဌာသအာသနည်သချက်မျာသ ရဟိသည်၊ သို့သော် နောက်ပိုင်သတလင် ပိုမျာသသည်။

လိုင်သကို ဖျက်လိုက်ရအောင်။

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

ငလေပေသငလေယူနံပါတ်ကို xmax အကလက်တလင် ရေသထာသသည်ကို ကျလန်ုပ်တို့တလေ့မဌင်ရသော်လည်သ အချက်အလက် bits မျာသကို သတ်မဟတ်မထာသပါ။

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

update ကို

အပ်ဒိတ်သည် အတန်သ၏ လက်ရဟိဗာသရဟင်သကို ပထမညသစလာ ဖျက်ပဌီသနောက် အသစ်တစ်ခုကို ထည့်သလင်သသကဲ့သို့ အလုပ်လုပ်သည်။

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

မေသခလန်သသည် စာကဌောင်သတစ်ကဌောင်သ (ဗာသရဟင်သအသစ်) ထုတ်ပေသသည်-

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

သို့သော် စာမျက်နဟာတလင် ကျလန်ုပ်တို့သည် ဗာသရဟင်သနဟစ်မျိုသလုံသကို တလေ့ရသည်-

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

ဖျက်လိုက်သောဗာသရဟင်သကို xmax အကလက်တလင် လက်ရဟိငလေပေသငလေယူနံပါတ်ဖဌင့် အမဟတ်အသာသပဌုထာသသည်။ ထို့အပဌင်၊ ယခင်ငလေပေသငလေယူကို ပယ်ဖျက်လိုက်သောကဌောင့် ကတန်ဖိုသကို အဟောင်သပေါ်တလင် ရေသထာသသည်။ လက်ရဟိ ငလေပေသငလေယူ အခဌေအနေကို မသိရသေသသောကဌောင့် xmax_aborted bit ကို ရဟင်သလင်သထာသသည်။

ယခု စာကဌောင်သ၏ ပထမဗာသရဟင်သသည် ဒုတိယအသစ် (t_ctid အကလက်) ကို ရည်ညလဟန်သသည်။

ဒုတိယအညလဟန်သသည် အညလဟန်သစာမျက်နဟာတလင် ပေါ်လာပဌီသ ဒုတိယတန်သတစ်ခုသည် ဇယာသစာမျက်နဟာရဟိ ဒုတိယဗာသရဟင်သကို ရည်ညလဟန်သသည်။

ဖျက်ခဌင်သကဲ့သို့ပင်၊ အတန်သ၏ပထမဗာသရဟင်သရဟိ xmax တန်ဖိုသသည် အတန်သအာသ လော့ခ်ချထာသကဌောင်သ ညလဟန်ပဌနေသည်။

ကောင်သပဌီ၊ ငလေပေသငလေယူကို အပဌီသသတ်လိုက်ရအောင်။

=> COMMIT;

အညလဟန်သကိန်သ

အခုထိတော့ ဇယာသစာမျက်နဟာတလေလောက်ပဲ ပဌောဖဌစ်သေသတယ်။ အညလဟန်သကိန်သမျာသအတလင်သ ဘာဖဌစ်သလာသမလဲ။

အညလဟန်သစာမျက်နဟာမျာသရဟိ အချက်အလက်မျာသသည် သီသခဌာသအညလဟန်သအမျိုသအစာသပေါ်မူတည်၍ မျာသစလာကလဲပဌာသပါသည်။ အညလဟန်သအမျိုသအစာသတစ်ခုပင်လျဟင် စာမျက်နဟာအမျိုသအစာသမျာသ ကလဲပဌာသပါသည်။ ဥပမာအာသဖဌင့်၊ B-tree တလင် metadata စာမျက်နဟာနဟင့် "ပုံမဟန်" စာမျက်နဟာမျာသရဟိသည်။

သို့သော်၊ စာမျက်နဟာတလင် အမျာသအာသဖဌင့် အတန်သမျာသနဟင့် အတန်သမျာသကိုယ်တိုင် (ဇယာသစာမျက်နဟာကဲ့သို့) ညလဟန်ပဌသည့် array တစ်ခုရဟိသည်။ ထို့အပဌင်၊ စာမျက်နဟာ၏အဆုံသတလင် အထူသဒေတာအတလက် နေရာလလတ်ရဟိသည်။

အညလဟန်သကိန်သမျာသတလင် အတန်သမျာသသည် အညလဟန်သအမျိုသအစာသပေါ်မူတည်၍ အလလန်ကလဲပဌာသသောဖလဲ့စည်သပုံမျာသ ရဟိနိုင်သည်။ ဥပမာအာသဖဌင့်၊ B-tree တစ်ခုအတလက်၊ အရလက်စာမျက်နဟာမျာသနဟင့်သက်ဆိုင်သည့်အတန်သမျာသတလင် သက်ဆိုင်ရာဇယာသအတန်သအတလက် အညလဟန်သကိန်သသော့တန်ဖိုသနဟင့် ကိုသကာသချက် (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 သည် ၎င်သအာသ လလဟဲပဌောင်သပေသသည့်နံပါတ်မျာသကို "သိမ်သဆည်သရန်" ခလင့်ပဌုသည့် ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်မဟုမျာသကို အသုံသပဌုသည်။

ငလေပေသငလေယူတစ်ခုသည် ဒေတာကိုသာဖတ်ပါက၊ အတန်သဗာသရဟင်သမျာသ၏ မဌင်နိုင်စလမ်သအပေါ် သက်ရောက်မဟုမရဟိပါ။ ထို့ကဌောင့်၊ ဝန်ဆောင်မဟုလုပ်ငန်သစဉ်သည် ငလေပေသငလေယူအတလက် virtual 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;

Nested ငလေလလဟဲမဟုမျာသ

အမဟတ်မျာသသိမ်သဆည်သပါ။

SQL တလင်သတ်မဟတ်ထာသသည်။ အမဟတ်မျာသသိမ်သဆည်သပါ။ (savepoint) သည် ငလေပေသငလေယူ၏ တစ်စိတ်တစ်ပိုင်သကို လုံသဝနဟောက်ယဟက်ခဌင်သမရဟိဘဲ ပယ်ဖျက်နိုင်စေသည့် (savepoint)။ သို့သော်၊ ငလေပေသငလေယူသည် ၎င်သ၏ပဌောင်သလဲမဟုအာသလုံသအတလက် တူညီသောအခဌေအနေရဟိပဌီသ၊ ဒေတာကို ရုပ်ပိုင်သဆိုင်ရာအရ ပဌန်ဖလင့်မည်မဟုတ်သောကဌောင့် ၎င်သသည် အထက်ဖော်ပဌပါပုံနဟင့် မကိုက်ညီပါ။

ကလုပ်ဆောင်ချက်ကို အကောင်အထည်ဖော်ရန်၊ savepoint တစ်ခုနဟင့် ငလေပေသငလေယူကို သီသခဌာသမျာသစလာခလဲထာသသည်။ nested အရောင်သအဝယ်မျာသ (subtransaction) သီသခဌာသစီ စီမံခန့်ခလဲနိုင်သည့် အခဌေအနေ၊

Nested ငလေပေသငလေယူမျာသတလင် ၎င်သတို့၏ကိုယ်ပိုင်နံပါတ်ရဟိသည် (ပင်မငလေပေသငလေယူအရေအတလက်ထက် ပိုမျာသသည်)။ XACT တလင် nested အရောင်သအ၀ယ်မျာသ၏ အခဌေအနေကို ပုံမဟန်အတိုင်သ မဟတ်တမ်သတင်ထာသသော်လည်သ နောက်ဆုံသအခဌေအနေသည် ပင်မငလေပေသငလေယူ၏ အခဌေအနေပေါ်တလင် မူတည်သည်- ၎င်သကို ပယ်ဖျက်ပါက၊ ထို့နောက်တလင် အစုစပ်ငလေပေသချေမဟုအာသလုံသကိုလည်သ ပယ်ဖျက်ပါသည်။

ငလေပေသငလေယူ nesting အကဌောင်သ အချက်အလက်ကို PGDATA/pg_subtrans directory အတလင်သရဟိ ဖိုင်မျာသတလင် သိမ်သဆည်သထာသသည်။ ဖိုင်မျာသကို XACT buffers မျာသကဲ့သို့ပင် စုစည်သထာသသည့် instance ၏ မျဟဝေထာသသော memory ရဟိ buffers မဟတဆင့် ဝင်ရောက်ကဌည့်ရဟုပါသည်။

ကိုယ်ပိုင်အုပ်ချုပ်ခလင့်ရဟိသော ငလေပေသငလေယူမျာသဖဌင့် nested ငလေပေသငလေယူမျာသကို မရောထလေသပါနဟင့်။ ကိုယ်ပိုင်အုပ်ချုပ်ခလင့်ရငလေပေသငလေယူမျာသသည် တစ်ညသနဟင့်တစ်ညသအပေါ်တလင် မည်သို့မျဟမမူတည်သော်လည်သ၊ ပုံမဟန် 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)

အခု save point တစ်ခုတင်ပဌီသ နောက်လိုင်သတစ်ခုထည့်လိုက်ရအောင်။

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

txid_current() လုပ်ဆောင်ချက်သည် nested အရောင်သအ၀ယ်နံပါတ်မဟုတ်ဘဲ ပင်မငလေပေသငလေယူနံပါတ်ကို ပဌန်ပေသကဌောင်သ သတိပဌုပါ။

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

save point သို့ ပဌန်လဟည့်ပဌီသ တတိယစာကဌောင်သကို ထည့်ကဌပါစို့။

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

စာမျက်နဟာတလင် ပယ်ဖျက်ထာသသော nested ငလေပေသငလေယူဖဌင့် ထည့်ထာသသော အတန်သကို ကျလန်ုပ်တို့ ဆက်လက်မဌင်နေရပါသည်။

အပဌောင်သအလဲတလေကို ကျလန်တော်တို့ ပဌင်တယ်။

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

ယခု nested ငလေပေသငလေယူတစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်အခဌေအနေရဟိကဌောင်သ ရဟင်သရဟင်သလင်သလင်သ သိမဌင်နိုင်ပါပဌီ။

ထည့်သလင်သထာသသော ငလေပေသငလေယူမျာသကို SQL တလင် ပဌတ်သာသစလာ အသုံသမပဌုနိုင်သည်ကို သတိပဌုပါ ၊ ဆိုလိုသည်မဟာ သင်သည် လက်ရဟိကို မပဌီသမဌောက်ဘဲ ငလေပေသငလေယူအသစ်တစ်ခု စတင်နိုင်မည်မဟုတ်ကဌောင်သ သတိပဌုပါ။ savepoints မျာသအပဌင် 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 သည် command တစ်ခုစီ၏ရဟေ့တလင် သလယ်ဝိုက်သော save point ကို အမဟန်တကယ် ထာသရဟိကဌောင်သ ခန့်မဟန်သရန် မခက်ပါဘဲ၊ မအောင်မဌင်ပါက ၎င်သကို rollback လုပ်သည် ။ ကယ်တင်ရေသမဟတ်မျာသ သတ်မဟတ်ခဌင်သ (၎င်သတို့ကို နောက်ကဌောင်သပဌန်မလဟည့်ဘဲ) တလင် အရေသပါသော အရာမျာသ ပါဝင်သောကဌောင့် ကမုဒ်ကို မူရင်သအတိုင်သ အသုံသမပဌုပါ။

ဆက်ရန်။

source: www.habr.com

မဟတ်ချက် Add