MVCC-3. Putanga aho

Na, kua whakaarohia e matou nga take e pa ana ki whakawetiweti, a ka huri haere te whakarite raraunga i te taumata iti. I te mutunga ka tae matou ki te waahanga tino pai - ko nga putanga aho.

Pane

I korerohia e matou, ka taea e ia rarangi te noho i te wa kotahi i roto i nga waahanga maha i roto i te papaarangi. Mo tenei kaupapa, e rua nga tohu o ia putanga hei whakatau i te "wa" o te mahi o tenei putanga (xmin me xmax). I roto i nga korukī - na te mea ehara i te waa penei ka whakamahia, engari he porotiti piki ake. A ko tenei porotiti te tau tauwhitinga.

(Pērā i mua, he uaua ake te mooni: e kore e taea e te tau tauwhitinga te piki ake i nga wa katoa na te iti o te kaha moka o te porotiti.

Ina hangahia he rarangi, ka tautuhia te xmin ki te tau tauwhitinga i puta te whakahau INSERT, ka waiho te xmax kia noho kau.

Ina mukua tetahi rarangi, ka tohua te uara xmax o te putanga o naianei ki te tau o te tauwhitinga i mahia te MUKU.

Ina whakarereketia te rarangi e te whakahau WHAKAUPAPA, e rua nga mahi ka mahia: MUKU me te KUPU. Ko te putanga o naianei o te rarangi e whakatakoto ana i te xmax e rite ana ki te tau o te tauwhitinga i mahia te WHAKAARO. Ka hangaia he putanga hou o taua aho ano; ko tona uara xmin e rite ana ki te uara xmax o te putanga o mua.

Ko nga mara xmin me te xmax kei roto i te upoko putanga rarangi. I tua atu i enei mara, kei roto i te pane etahi atu, hei tauira:

  • Ko te infomask he raupapa moka e tautuhi ana i nga ahuatanga o tenei putanga. He maha tonu o ratou; Ka ata whakaarohia e tatou nga mea matua.
  • Ko te ctid he hononga ki te putanga hou ake o te raina kotahi. Mo te putanga hou, te nuinga o naianei o te aho, e tohu ana te ctid ki tenei putanga ake. Kei te tau te ahua (x,y), ko x te tau wharangi, ko y te tau taupū o te huinga.
  • Maheremoka null - Ka tohu i nga pou o te putanga kua homai he uara kore (NULL). Ehara a NULL i tetahi o nga uara momo raraunga noa, no reira me penapena motuhake te huanga.

Ko te mutunga, he tino nui te pane - neke atu i te 23 paita mo ia putanga o te raina, me te nuinga ake na te mapi-moka NULL. Mēnā he "whāiti" te ripanga (arā, he iti noa ngā tīwae), ka nui ake pea te utu o runga ake i nga korero whai hua.

kōkuhu

Kia ata titiro tatou ki te mahi i nga mahi aho taumata-iti, timata mai i te whakauru.

Mo nga whakamatautau, me hanga he ripanga hou me nga pou e rua me tetahi tohu ki runga i tetahi o aua mea:

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

Me whakauru tetahi rarangi i muri i te tiimata o te tauwhitinga.

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

Anei ta matou tau tauwhitinga o naianei:

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

Kia titiro tatou ki nga korero o te wharangi. Ko te mahi heap_page_items o te toronga pageinspect ka taea e koe te tiki korero mo nga tohutohu me nga putanga haupae:

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

Kia mahara ko te kupu heap i PostgreSQL e pa ana ki nga ripanga. Koinei tetahi atu whakamahinga o te kupu - he puranga e mohiotia ana hanganga raraunga, kaore he mea e rite ana ki te tepu. I konei ka whakamahia te kupu i roto i te tikanga o te "ka maka tahi nga mea katoa," he rereke ki nga tohu tohu.

Ko te mahi e whakaatu ana i nga raraunga "penei", i roto i te whakatakotoranga he uaua ki te mohio. Kia mohio ai, ka waiho noa he wahanga o nga korero ka whakamaarama:

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

Anei ta matou mahi:

  • I tapirihia he kore ki te tau taupū kia rite ai te ahua ki t_ctid: (tau wharangi, tau taupū).
  • I whakatauhia te ahua o te tohu tohu lp_flags. Anei he "noa" - ko te tikanga ko te tohutoro e tino korero ana ki te putanga o te aho. Ka titiro tatou ki etahi atu tikanga a muri ake nei.
  • O nga moka korero katoa, e rua noa nga takirua kua kitea i tenei wa. Ko nga moka xmin_committed me te xmin_aborted e tohu ana mena kua mahia te tau tauwhitinga xmin (kua whakatahe). E rua nga moka rite ki te tau tauwhitinga xmax.

He aha ta tatou e kite ana? Ina whakauru koe i te rarangi, ka puta mai he nama taurangi 1 ki te wharangi ripanga, e tohu ana ki te putanga tuatahi me te putanga anake o te rarangi.

I roto i te putanga aho, kua whakakiia te mara xmin ki te tau tauwhitinga o naianei. Kei te hohe tonu te tauwhitinga, no reira ko nga moka xmin_committed me te xmin_aborted kaore i whakaritea.

Ko te rarangi putanga ctid mara e pa ana ki te rarangi kotahi. Ko te tikanga karekau he putanga hou ake.

Kua whakakīia te āpure xmax ki te nama 0 hangai nā te mea karekau tēnei putanga o te haupae i mukua, ā, kei te noho tonu. Kare nga tauwhitinga e aro ki tenei nama na te mea kua whakaritea te moka xmax_aborted.

Kia kotahi ano te mahi ki te whakapai ake i te panui ma te taapiri i nga moka korero ki nga tau tauwhitinga. Me hanga he mahi, na te mea ka nui ake i te kotahi te tono:

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

I roto i tenei ahua, ka tino marama ake he aha kei te haere i te pane o te putanga haupae:

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

He rite, engari he iti ake te taipitopito, ka taea te tiki korero mai i te ripanga ake, ma te whakamahi i nga pou-pseudo xmin me te xmax:

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

Whakatikatika

Mena kua tutuki pai tetahi tauwhitinga, me maumahara koe ki tona mana - me mahara kua tutuki. Hei mahi i tenei, ka whakamahia he hanganga e kiia nei ko XACT (a, i mua i te putanga 10 i kiia ko CLOG (komit log) ka kitea tonu tenei ingoa ki nga waahi rereke).

Ehara te XACT i te ripanga putumōhio pūnaha; Ko enei nga konae kei te raarangi PGDATA/pg_xact. E rua nga moka kua tohatohahia mo ia tauwhitinga: kua whakapumautia, kua whakatakahia - pera ano i te pane putanga haupae. Kua wehea enei korero ki etahi momo konae mo te waatea noa; ka hoki ano matou ki tenei take ina whakaaro matou ki te whakatio. A ko te mahi me enei konae ka mahia i ia wharangi, pera me era atu.

Na, ka mahia he tauwhitinga i roto i te XACT, ka whakaritea te moka tuku mo tenei tauwhitinga. A koinei anake nga mea ka puta i te wa e mahi ana (ahakoa kaore matou e korero ana mo te raarangi rekoata o mua).

Ina uru atu tetahi atu tauwhitinga ki te wharangi ripanga i tirohia e matou, me whakautu e ia etahi patai.

  1. Kua oti te tauwhitinga xmin? Ki te kore, ka kore e kitea te putanga hanga o te aho.
    Ka mahia tenei haki ma te titiro ki tetahi atu hanganga, kei roto i te mahara tahi o te tauira ka kiia ko ProcArray. Kei roto he rarangi o nga tukanga hohe katoa, a, mo ia mea ka tohuhia te maha o ana tauwhitinga (hohe) o naianei.
  2. Mena kua oti, me pehea - ma te tuku, te whakakore ranei? Ki te whakakorehia, ka kore e kitea te putanga haupae.
    Koinei tonu te mahi a XACT. Engari, ahakoa ko nga wharangi whakamutunga o XACT kei te rongoa i roto i nga kaitarai i roto i te RAM, he utu tonu te tirotiro i te XACT i nga wa katoa. Na reira, ka whakatauhia te mana tauwhitinga, ka tuhia ki nga moka xmin_committed me te xmin_aborted o te putanga aho. Mena kua tautuhia tetahi o enei paraka, ka kiia ko te ahua o te tauwhitinga xmin kua mohiotia, a, ko te whakawhitinga e whai ake nei kaore e uru ki te XACT.

He aha te take kaore enei moka i tautuhia e te tauwhitinga ake e mahi ana i te whakauru? Ka puta he whakaurunga, kare ano te tauwhitinga i te mohio mena ka angitu. A i te wa e mahi ana, kua kore e tino marama ko nga rarangi i whakarerekehia nga wharangi. He maha pea nga wharangi penei, me te maumahara kaore he painga. I tua atu, ka taea te peia etahi wharangi mai i te keteroki buffer ki te kōpae; Ko te panui ano ki te whakarereke i nga moka ka tino whakaroa te mahi.

Ko te kino o nga penapena ko te mea i muri i nga huringa, ka taea e tetahi tauwhitinga (ahakoa he panui ngawari - SELECT) ka tiimata ki te huri i nga wharangi raraunga i roto i te keteroki buffer.

Na, me whakatika te huringa.

=> COMMIT;

Karekau he mea i huri i te wharangi (engari e mohio ana matou kua rehitatia te mana tauwhitinga ki XACT):

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

Inaianei ko te tauwhitinga ka uru ki te wharangi tuatahi me whakatau te mana tauwhitinga xmin me te tuhi ki nga moka korero:

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

Mukua

Ina mukua tetahi rarangi, ka tuhia te nama o te tauwhitinga whakakore o naianei ki te mara xmax o te putanga o naianei, a ka whakakorehia te moka xmax_aborted.

Kia mahara ko te uara kua whakaritea o te xmax e rite ana ki te tauwhitinga hohe hei raka rarangi. Mena kei te hiahia tetahi atu tauwhitinga ki te whakahou, ki te whakakore ranei i tenei rarangi, ka kaha ki te tatari kia oti te whakawhitinga xmax. Ka korero ano tatou mo te aukati i muri mai. I tenei wa, ka kite noa matou he mutunga kore te maha o nga raka rarangi. Kaore ratou e tango i te waahi i roto i te RAM me te mahi a te punaha kaore i te mamae i to raatau nama. He pono, ko nga whakawhitinga "roa" etahi atu ngoikoretanga, engari ka nui ake i muri mai.

Kia whakakorehia te raina.

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

Ka kite matou kua tuhia te nama tauwhitinga ki te mara xmax, engari kaore i te tautuhia nga moka korero:

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

whakakorenga

He rite te mahi a te whakakore i nga huringa ki te mahi, kei XACT anake te moka kua whakatakahia mo te tauwhitinga. He tere te whakakore i te mahi. Ahakoa ko te whakahau e kiia ana ko ROLLBACK, kaore e hurihia nga huringa: ko nga mea katoa i whakahaerehia e te tauwhitinga ki te huri i nga wharangi raraunga ka noho tonu.

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

Ina uru atu ki te wharangi, ka tirohia te mana ka tohua te moka tohu xmax_aborted ki te putanga rarangi. Ko te nama xmax tonu kei runga i te wharangi, engari karekau tetahi e titiro.

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

Whakahou

Ka mahi te whakahou me te mea i mukua e ia te putanga o naianei o te rarangi ka whakauruhia he mea hou.

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

Ka mahia e te patai tetahi raina (putanga hou):

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

Engari i runga i te wharangi ka kite tatou i nga putanga e rua:

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

Ko te putanga kua mukua kua tohua ki te tau tauwhitinga o naianei i te mara xmax. I tua atu, ka tuhia tenei uara ki runga i te tawhito, no te mea kua whakakorehia te whakawhitinga o mua. A ka whakakorehia te moka xmax_aborted na te mea kaore ano kia mohiotia te mana o te tauwhitinga o naianei.

Ko te putanga tuatahi o te raina inaianei e tohu ana ki te tuarua (t_ctid mara) hei mea hou ake.

Ka puta he tohu tuarua ki te wharangi taurangi, ka tohutoro te rarangi tuarua ki te putanga tuarua i te wharangi ripanga.

Pērā i te mukunga, ko te uara xmax i te putanga tuatahi o te rarangi he tohu kei te maukati te rarangi.

Kaati, kia whakaotia te tauwhitinga.

=> COMMIT;

Ngā Tauira

I tenei wa kua korero noa matou mo nga wharangi ripanga. Ka aha i roto i nga tohu tohu?

He rereke nga korero kei roto i nga wharangi taurangi i runga i te momo taurangi. A ahakoa ko tetahi momo taurangi he rereke nga momo wharangi. Hei tauira, ko te B-rakau he wharangi metadata me nga wharangi "noa".

Heoi, ko te wharangi he maha nga tohu tohu ki nga rarangi me nga rarangi ano (penei i te wharangi ripanga). I tua atu, i te mutunga o te wharangi he waahi mo nga raraunga motuhake.

Ka taea hoki e nga rarangi i roto i nga tohu te rereke nga hanganga i runga i te momo tohu. Hei tauira, mo te rakau-B, kei roto i nga rarangi e pa ana ki nga wharangi rau te uara matua taupū me te tohutoro (ctid) ki te rarangi ripanga e rite ana. I te nuinga o te waa, ka taea te hanga i te tohu ki tetahi huarahi rereke.

Ko te mea nui ko te kore he putanga haupae i roto i nga taupū o tetahi momo. Kaati, ka taea ranei e tatou te whakaaro ko ia rarangi e tohuhia ana e te putanga kotahi. I etahi atu kupu, kaore he xmin me te xmax mara i roto i te pane rarangi tohu. Ka taea e tatou te whakaaro ko nga hononga mai i te taurangi ka arahi ki nga putanga ripanga katoa o nga rarangi - kia mohio koe ko tehea putanga ka kitea e te tauwhitinga ma te titiro ki te ripanga. (I nga wa katoa, ehara tenei i te mea pono katoa. I etahi wa, ka taea e te mapi whakakitenga te arotau i te mahi, engari ka ata tirohia tenei i muri mai.)

I te wa ano, kei te wharangi taurangi ka kitea nga tohu tohu ki nga putanga e rua, ko te mea o naianei me te mea tawhito:

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

Nga whakawhitinga mariko

I roto i te mahi, ka whakamahi a PostgreSQL i nga arotautanga e taea ai te "whakaora" i nga tau tauwhitinga.

Mēnā ka pānui raraunga noa tētahi tauwhitinga, karekau he pānga ki te kitenga o ngā putanga haupae. Na reira, ko te tukanga ratonga tuatahi ka tukuna he xid mariko ki te tauwhitinga. Kei roto i te nama he ID tukanga me te tau raupapa.

Ko te tuku i tenei tau kaore e hiahiatia te tukutahi i waenga i nga mahi katoa, na reira he tere rawa. Ka mohio tatou ki tetahi atu take mo te whakamahi i nga nama mariko ina korero tatou mo te tio.

Ko nga tau mariko kaore e whakaarohia i roto i nga ahuatanga o nga whakaahua raraunga.

I nga waahi rereke o te waa, tera pea he whakawhitinga mariko i roto i te punaha me nga nama kua whakamahia, he mea noa tenei. Engari kaore e taea te tuhi i taua tau ki nga wharangi raraunga, na te mea ka uru atu te wharangi ka ngaro te tikanga.

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

Mena ka timata tetahi tauwhitinga ki te huri i nga raraunga, ka hoatu he tau tauwhitinga tuuturu, ahurei.

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

=> COMMIT;

Tauwhitinga Kohanga

Tiakina nga tohu

Kua tautuhia ki te SQL tiakina nga tohu (savepoint), ka taea e koe te whakakore i tetahi waahanga o te tauwhitinga me te kore e tino whakaporearea. Engari kaore tenei e uru ki te hoahoa o runga ake nei, i te mea he rite tonu te mana o te tauwhitinga mo ona huringa katoa, a, karekau he raraunga e hoki whakamuri.

Hei whakatinana i tenei mahi, ka wehea te tauwhitinga me te waahi penapena ki etahi waahanga motuhake whakawhitinga kohanga (subtransaction), ka taea te whakahaere motuhake te mana.

Ko nga tauwhitinga kohanga kei a raatau ake tau (he teitei ake i te tau o te tauwhitinga matua). Ko te mana o nga whakawhitinga kohanga ka tuhia i roto i te ahua o mua i roto i te XACT, engari ko te mana whakamutunga kei runga i te mana o te tauwhitinga matua: ki te whakakorehia, ka whakakorehia ano nga whakawhitinga kohanga katoa.

Ko nga korero mo te kohanga tauwhitinga ka rongoa ki nga konae kei te raarangi PGDATA/pg_subtrans. Ka uru atu nga konae ma roto i nga putunga i roto i te mahara tiritiri o te tauira, he rite tonu te whakarite ki nga putunga XACT.

Kaua e whakapoauau i nga tauwhitinga kohanga me nga tauwhitinga motuhake. Ko nga tauwhitinga motuhake kaore i te whakawhirinaki tetahi ki tetahi, engari ko nga whakawhitinga kohanga. Karekau he tauwhitinga motuhake i roto i te PostgreSQL i ia wa, a, pea, mo te mea pai rawa atu: he tino uaua, he onge, me to ratou noho ki etahi atu DBMS ka whakapataritari i te mahi kino, na reira ka mamae te katoa.

Me whakawātea i te ripanga, tīmata i te tauwhitinga me te kōkuhu i te haupae:

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

Inaianei me whakatakoto he tohu tiaki ka whakauru i tetahi atu rarangi.

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

Kia mahara ko te mahi xxid_current() ka whakahoki i te tau tauwhitinga matua, ehara i te tau tauwhitinga kua kohanga.

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

Me huri ano ki te waahi whakaora ka whakauru i te rarangi tuatoru.

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

I te wharangi ka kite tonu matou i te rarangi taapiri e te tauwhitinga kohanga kua whakakorehia.

Ka whakatikahia e matou nga huringa.

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

Inaianei ka tino kite koe kei ia tauwhitinga kohanga tona ake mana.

Kia mahara kaore e taea te whakamahi i nga tauwhitinga kohanga i roto i te SQL, ara, kaore e taea e koe te timata i tetahi tauwhitinga hou me te kore e whakaoti i te waa. Ka whakahohehia tenei tikanga i te wa e whakamahi ana i nga waahi penapena, me te wa e whakahaere ana i nga tuunga PL/pgSQL me etahi atu keehi tino rerekee.

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

Nga hapa me te ngota o nga mahi

Ka aha mena ka puta he hapa i te wa e mahi ana? Hei tauira, penei:

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

Kua puta he hapa. Inaianei kua kiia te tauwhitinga kua whakakorea, kaore e whakaaetia he mahi ki roto:

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

A ahakoa ka ngana koe ki te mahi i nga huringa, ka ripoatahia e PostgreSQL he whakatahe:

=> COMMIT;
ROLLBACK

He aha e kore ai e taea te haere tonu te tauwhitinga i muri i te rahua? Ko te meka ka puta he hapa kia uru atu tatou ki tetahi waahanga o nga huringa - te ngota o te kore noa o te tauwhitinga, engari ka takahia te kaiwhakahaere. Ka rite ki ta maatau tauira, i whakahaerehia e te kaiwhakahaere te whakahou i tetahi raina i mua i te hapa:

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

Me kii kei te psql tetahi aratau e tuku tonu ana i te hokohoko ki te haere tonu i muri i te korenga me te mea kua hurihia nga mahi a te kaiwhakahaere pohehe.

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

Ehara i te mea uaua ki te whakaaro kei roto i tenei aratau, ka tukuna e te psql he tohu whakaora i mua i ia whakahau, a, ki te kore e taea, ka timata te hurihanga ki a ia. Ko tenei aratau kaore e whakamahia ma te taunoa, na te mea ko te tautuhi i nga tohu tiaki (ahakoa kare e hoki ki muri) he nui te utu.

Haere tonu.

Source: will.com

Tāpiri i te kōrero