MVCC-3. Tionndaidhean sreang

Mar sin, tha sinn air beachdachadh air cùisean co-cheangailte ri insulation, agus rinn e turus mu'n cuairt eagrachadh dàta aig ìre ìosal. Agus mu dheireadh ràinig sinn am pàirt as inntinniche - na dreachan sreang.

Ceannard

Mar a thuirt sinn mu thràth, faodaidh gach sreath a bhith ann aig an aon àm ann an grunn dhreachan san stòr-dàta. Feumaidh aon dreach a bhith eadar-dhealaichte bho fhear eile airson an adhbhair seo, tha dà chomharra air gach dreach a tha a’ dearbhadh “ùine” gnìomh an tionndaidh seo (xmin agus xmax). Ann an cuòtan - oir chan e ùine mar sin a thathas a ’cleachdadh, ach cuntair àrdachaidh sònraichte. Agus is e an àireamh malairt seo an àireamh malairt.

(Mar as àbhaist, tha an fhìrinn nas toinnte: chan urrainn don àireamh malairt àrdachadh fad na h-ùine air sgàth cho beag de chomas a th’ aig a’ chunntair. Ach bheir sinn sùil mhionaideach air na mion-fhiosrachadh sin nuair a ruigeas sinn an reothadh.)

Nuair a thèid sreath a chruthachadh, tha xmin air a shuidheachadh chun àireamh malairt a chuir a-mach an àithne INSERT, agus tha xmax air fhàgail bàn.

Nuair a thèid sreath a dhubhadh às, tha luach xmax an tionndaidh làithreach air a chomharrachadh le àireamh a’ ghnothaich a rinn an DELETE.

Nuair a thèid sreath atharrachadh le àithne ÙRACHADH, thèid dà ghnìomhachd a choileanadh: DELETE agus INSERT. Tha an dreach làithreach den loidhne a’ suidheachadh xmax co-ionann ris an àireamh de ghnothaich a rinn an ÙRACHADH. Thèid dreach ùr den aon sreang a chruthachadh an uairsin; tha a luach xmin aig an aon àm ri luach xmax an tionndaidh roimhe.

Tha na raointean xmin agus xmax air an toirt a-steach don bhann-cinn dreach sreath. A bharrachd air na raointean sin, tha feadhainn eile anns a’ cheann-cinn, mar eisimpleir:

  • Tha infomask na shreath de phìosan a tha a’ mìneachadh feartan an tionndaidh seo. Tha moran diubh ann ; Mean air mhean beachdaichidh sinn air na prìomh fheadhainn.
  • Tha ctid na cheangal ris an ath dhreach nas ùire den aon loidhne. Airson an dreach as ùire, as ùire de shreang, tha an ctid a’ toirt iomradh air an dreach seo fhèin. Tha an fhoirm aig an àireamh (x,y), far a bheil x mar àireamh na duilleige, is e y an àireamh clàr-amais san raon.
  • null bitmap - Comharraich na colbhan sin de dhreach sònraichte anns a bheil luach null (NULL). Chan e NULL aon de na luachan seòrsa dàta àbhaisteach, agus mar sin feumaidh am feart a bhith air a stòradh air leth.

Mar thoradh air an sin, tha an bann-cinn gu math mòr - co-dhiù 23 bytes airson gach dreach den loidhne, agus mar as trice barrachd air sgàth mapa-bit NULL. Ma tha an clàr “caol” (is e sin, le glè bheag de cholbhan), dh’ fhaodadh gun toir an t-àrdachadh barrachd air an fhiosrachadh feumail.

cuir a-steach

Bheir sinn sùil nas mionaidiche air mar a tha gnìomhachd sreang aig ìre ìosal air a dhèanamh, a’ tòiseachadh le cuir a-steach.

Airson deuchainnean, cruthaichidh sinn clàr ùr le dà cholbh agus clàr-amais air aon dhiubh:

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

Nach cuir sinn a-steach aon sreath às deidh dhuinn malairt a thòiseachadh.

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

Seo an àireamh malairt gnàthach againn:

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

Bheir sinn sùil air susbaint na duilleige. Leigidh gnìomh heap_page_items an leudachaidh pageinspect dhut fiosrachadh fhaighinn mu chomharran agus dreachan sreath:

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

Thoir an aire gu bheil am facal tiùrr ann am PostgreSQL a’ toirt iomradh air clàran. Is e cleachdadh neònach eile a tha seo den teirm - tha fios air carragh structar dàta, aig nach eil ni sam bith co-chosmhail ris a' bhòrd. An seo tha am facal air a chleachdadh anns an fhaireachdainn “tha a h-uile dad air a thilgeil ri chèile,” seach clàran-amais òrdaichte.

Tha an gnìomh a’ sealltainn dàta “mar a tha”, ann an cruth a tha doirbh a thuigsinn. Gus obrachadh a-mach, fàgaidh sinn dìreach pàirt den fhiosrachadh agus dì-chuimhnich sinn e:

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

Seo na rinn sinn:

  • Chuir sinn neoni ris an àireamh clàr-amais gus toirt air coimhead co-ionann ri t_ctid : (àireamh duilleag, àireamh clàr-amais).
  • Mìnich staid a’ phuing lp_flags. An seo tha e "àbhaisteach" - tha seo a 'ciallachadh gu bheil am puing gu dearbh a' toirt iomradh air an tionndadh den t-sreang. Bheir sinn sùil air brìgh eile nas fhaide air adhart.
  • De na pìosan fiosrachaidh gu lèir, cha deach ach dà phaidhir a chomharrachadh gu ruige seo. Tha na pìosan xmin_committed agus xmin_aborted a’ sealltainn a bheil àireamh malairt xmin air a ghealltainn (sgrìobadh). Tha dà phìos coltach ris a’ toirt iomradh air àireamh malairt xmax.

Dè a chì sinn? Nuair a chuireas tu a-steach sreath, nochdaidh clàr-amais àireamh 1 air duilleag a’ chlàir, a’ comharrachadh a’ chiad agus an aon dreach den loidhne.

Anns an tionndadh sreang, tha an raon xmin air a lìonadh leis an àireamh malairt gnàthach. Tha an gnothach fhathast gnìomhach, agus mar sin chan eil an dà chuid na pìosan xmin_committed agus xmin_aborted air an suidheachadh.

Tha an raon dreach sreath ctid a’ toirt iomradh air an aon sreath. Tha seo a’ ciallachadh nach eil tionndadh nas ùire ann.

Tha an raon xmax air a lìonadh le àireamh dubhach 0 a chionn 's nach deach an tionndadh seo den loidhne a sguabadh às agus tha e làithreach. Cha toir gnothaichean an aire don àireamh seo a chionn 's gu bheil am pìos xmax_aborted air a shuidheachadh.

Gabhamaid aon cheum eile a dh’ionnsaigh leasachadh leughaidh le bhith a’ cur pìosan fiosrachaidh ri àireamhan malairt. Agus cruthaichidh sinn gnìomh, oir bidh feum againn air an iarrtas barrachd air aon uair:

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

Anns an fhoirm seo, tha e tòrr nas soilleire dè a tha a 'dol air adhart ann am bann-cinn an dreach sreath:

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

Gheibhear fiosrachadh coltach ris, ach gu math nas mionaidiche, bhon chlàr fhèin, a’ cleachdadh colbhan-brèige xmin agus xmax:

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

Fixation

Ma tha malairt air a chrìochnachadh gu soirbheachail, feumaidh tu cuimhneachadh air an inbhe aige - thoir an aire gu bheil e dealasach. Gus seo a dhèanamh, thathas a’ cleachdadh structar ris an canar XACT (agus ron dreach 10 b’ e CLOG (log gealltanas) a bh’ air agus gheibhear an t-ainm seo fhathast ann an diofar àiteachan).

Chan e clàr catalog siostam a th’ ann an XACT; is iad sin na faidhlichean anns an eòlaire PGDATA/pg_xact. Tha dà phìos aca airson gach gnothach: dealasach agus sgur - dìreach mar a tha ann am bann-cinn an dreach sreath. Tha am fiosrachadh seo air a roinn ann an grunn fhaidhlichean a-mhàin airson goireasachd; tillidh sinn chun chùis seo nuair a bheachdaicheas sinn air reothadh. Agus thathas ag obair leis na faidhlichean sin duilleag air duilleag, mar a h-uile càil eile.

Mar sin, nuair a thèid gnothach a ghealltainn ann an XACT, tha am pìos dealasach air a shuidheachadh airson a’ ghnothaich seo. Agus is e seo a h-uile càil a thachras aig àm gealltanas (ged nach eil sinn fhathast a’ bruidhinn mun log ro-chlàraidh).

Nuair a gheibh malairt eile cothrom air duilleag a’ bhùird air an do choimhead sinn, feumaidh e grunn cheistean a fhreagairt.

  1. A bheil an gnothach xmin crìochnaichte? Mura h-eil, cha bu chòir an dreach cruthaichte den t-sreang a bhith ri fhaicinn.
    Thèid an sgrùdadh seo a dhèanamh le bhith a’ coimhead air structar eile, a tha suidhichte ann an cuimhne co-roinnte an t-eisimpleir agus ris an canar ProcArray. Tha liosta ann de na pròiseasan gnìomhach air fad, agus airson gach fear tha an àireamh de ghnìomhachd gnàthach (gnìomhach) air a chomharrachadh.
  2. Ma tha e deiseil, ciamar - le bhith a’ gealltainn no a’ cuir dheth? Ma thèid a chuir dheth, cha bu chòir an tionndadh loidhne a bhith ri fhaicinn nas motha.
    Is ann dìreach airson seo a tha XACT. Ach, ged a tha na duilleagan mu dheireadh de XACT air an stòradh ann am bufairean ann an RAM, tha e fhathast daor sgrùdadh a dhèanamh air XACT a h-uile turas. Mar sin, aon uair ‘s gu bheil an inbhe malairt air a dhearbhadh, tha e sgrìobhte gu pìosan xmin_committed agus xmin_aborted den dreach sreang. Ma tha aon de na pìosan sin air a shuidheachadh, thathas den bheachd gu bheil staid malairt xmin aithnichte agus cha bhith aig an ath ghnothach ri faighinn gu XACT.

Carson nach eil na pìosan sin air an suidheachadh leis a’ ghnothach fhèin a’ cur a-steach? Nuair a thachras cuir a-steach, chan eil fios aig a’ ghnothach fhathast am bi e soirbheachail. Agus aig an àm a tha iad a 'gealltainn, chan eil e soilleir tuilleadh dè na loidhnichean anns an deach na duilleagan atharrachadh. Is dòcha gu bheil tòrr dhuilleagan mar sin ann, agus tha e neo-phrothaideach a bhith gan cuimhneachadh. A bharrachd air an sin, faodar cuid de dhuilleagan fhuadach bhon tasgadan bufair gu diosc; le bhith gan leughadh a-rithist gus na pìosan atharrachadh chuireadh sin maill gu mòr air a’ ghealladh.

Is e an eas-bhuannachd de shàbhalaidhean, às deidh atharrachaidhean, gun urrainn do ghnothach sam bith (eadhon aon a’ coileanadh leughadh sìmplidh - SELECT) tòiseachadh air duilleagan dàta atharrachadh anns an tasgadan bufair.

Mar sin, leig dhuinn an t-atharrachadh a cheartachadh.

=> COMMIT;

Chan eil dad air atharrachadh air an duilleag (ach tha fios againn gu bheil inbhe a’ ghnothaich air a chlàradh mu thràth ann an XACT):

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

A-nis feumaidh an gnothach a ruigeas an duilleag an toiseach inbhe malairt xmin a dhearbhadh agus a sgrìobhadh gu na pìosan fiosrachaidh:

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

Delete

Nuair a thèid sreath a dhubhadh às, thèid àireamh a’ ghnothaich sguabaidh às an-dràsta a sgrìobhadh gu raon xmax an tionndaidh làithreach, agus thèid am pìos xmax_aborted fhuadach.

Thoir an aire gu bheil an luach seata de xmax a tha co-chosmhail ris a’ ghnothach gnìomhach ag obair mar ghlas sreath. Ma tha malairt eile ag iarraidh an loidhne seo ùrachadh no a sguabadh às, bidh aige ri feitheamh gus an tèid malairt xmax a chrìochnachadh. Bruidhnidh sinn barrachd mu dheidhinn bacadh nas fhaide air adhart. Airson a-nis, tha sinn dìreach a ’toirt fa-near gu bheil an àireamh de ghlasan sreath gun chrìoch. Cha bhith iad a’ gabhail àite ann an RAM agus chan eil coileanadh siostam a’ fulang leis an àireamh aca. Fìor, tha eas-bhuannachdan eile aig gnothaichean “fada”, ach barrachd air sin nas fhaide air adhart.

Leig dhuinn an loidhne a sguabadh às.

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

Chì sinn gu bheil an àireamh malairt sgrìobhte anns an raon xmax, ach chan eil na pìosan fiosrachaidh air an suidheachadh:

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

dhubhadh às

Bidh casg air atharrachaidhean ag obair mar an ceudna ri gealltainn, is ann dìreach ann an XACT a tha am pìos air a thoirmeasg air a shuidheachadh airson a’ ghnothaich. Tha cur dheth cho luath ri gealltainn. Ged is e ROLLBACK a chanar ris an àithne, chan eil atharrachaidhean air an toirt air ais: tha a h-uile dad a chaidh aig a’ ghnothach air atharrachadh anns na duilleagan dàta fhathast gun atharrachadh.

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

Nuair a gheibhear cothrom air an duilleag, thèid an inbhe a sgrùdadh agus thèid am pìos hint xmax_aborted a shuidheachadh don tionndadh loidhne. Tha an àireamh xmax fhèin fhathast air an duilleag, ach cha toir duine sùil air.

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

Ùrachadh

Bidh an t-ùrachadh ag obair mar gum biodh e an-toiseach air an dreach làithreach den loidhne a dhubhadh às agus an uairsin cuir a-steach fear ùr.

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

Bidh a’ cheist a’ toirt a-mach aon loidhne (dreach ùr):

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

Ach air an duilleag chì sinn an dà dhreach:

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

Tha an dreach a chaidh a dhubhadh às air a chomharrachadh leis an àireamh malairt gnàthach anns an raon xmax. A bharrachd air an sin, tha an luach seo sgrìobhte thairis air an t-seann fhear, leis gun deach an gnothach roimhe a chuir dheth. Agus tha am pìos xmax_aborted air fhuadach a chionn 's nach eil fios fhathast air inbhe a' ghnothaich làithreach.

Tha a’ chiad dreach den loidhne a-nis a’ toirt iomradh air an dàrna fear (t_ctid field) mar an tè as ùire.

Tha dàrna clàr-amais a’ nochdadh air duilleag a’ chlàr-amais agus tha dàrna sreath a’ toirt iomradh air an dàrna tionndadh air duilleag a’ chlàir.

Dìreach mar le sguabadh às, tha an luach xmax sa chiad dreach den loidhne na chomharra gu bheil an loidhne glaiste.

Uill, leig dhuinn an gnothach a chrìochnachadh.

=> COMMIT;

Clàran-innse

Gu ruige seo chan eil sinn air bruidhinn ach mu dhuilleagan bùird. Dè thachras taobh a-staigh na clàran-amais?

Bidh am fiosrachadh ann an duilleagan clàr-amais ag atharrachadh gu mòr a rèir an seòrsa sònraichte de chlàr-amais. Agus tha diofar sheòrsaichean de dhuilleagan aig eadhon aon seòrsa de chlàr-amais. Mar eisimpleir, tha duilleag meata-dàta agus duilleagan “cunbhalach” aig craobh-B.

Ach, mar as trice tha sreath de chomharran air an duilleag mu na sreathan agus na sreathan fhèin (dìreach mar duilleag bùird). A bharrachd air an sin, aig deireadh na duilleige tha àite ann airson dàta sònraichte.

Faodaidh structaran gu math eadar-dhealaichte a bhith aig sreathan ann an clàran-amais a rèir an seòrsa clàr-amais. Mar eisimpleir, airson craobh-B, tha an luach iuchrach clàrachaidh anns na sreathan co-cheangailte ri duilleagan duille agus iomradh (ctid) air an t-sreath bùird co-fhreagarrach. San fharsaingeachd, faodar an clàr-amais a structaradh ann an dòigh gu tur eadar-dhealaichte.

Is e a’ phuing as cudromaiche nach eil dreachan sreath ann an clàran-amais de sheòrsa sam bith. Uill, no faodaidh sinn gabhail ris gu bheil gach loidhne air a riochdachadh le dìreach aon dreach. Ann am faclan eile, chan eil raointean xmin agus xmax ann am bann-cinn sreath a’ chlàr-amais. Faodaidh sinn gabhail ris gu bheil ceanglaichean bhon chlàr-amais a’ leantainn gu gach dreach clàr de na sreathan - gus an obraich thu a-mach dè an dreach a chì an gnothach dìreach le bhith a’ coimhead air a’ chlàr. (Mar as àbhaist, chan e seo an fhìrinn gu lèir. Ann an cuid de chùisean, faodaidh am mapa faicsinneachd am pròiseas a mheudachadh, ach bheir sinn sùil nas mionaidiche air an seo nas fhaide air adhart.)

Aig an aon àm, anns an duilleag clàr-amais lorgaidh sinn comharran airson an dà dhreach, an dà chuid an tè a th’ ann an-dràsta agus an t-seann fhear:

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

Gnìomhan mas-fhìor

Ann an cleachdadh, bidh PostgreSQL a’ cleachdadh optimizations a leigeas leis àireamhan malairt “a shàbhaladh”.

Mura leugh malairt dàta a-mhàin, chan eil buaidh sam bith aige air faicsinneachd dreachan sreath. Mar sin, bidh am pròiseas seirbheis an-toiseach a’ toirt a-mach virtual xid don ghnothach. Tha an àireamh air a dhèanamh suas de ID pròiseas agus àireamh sreath.

Gus an àireamh seo a thoirt a-mach chan eil feum air sioncronadh eadar a h-uile pròiseas agus mar sin tha e gu math luath. Gheibh sinn eòlas air adhbhar eile airson àireamhan brìgheil a chleachdadh nuair a bhios sinn a’ bruidhinn air reothadh.

Chan eilear a’ toirt aire do àireamhan brìgheil ann an dòigh sam bith ann an dealbhan dàta.

Aig diofar amannan, is dòcha gu bheil gnothaichean brìgheil san t-siostam le àireamhan a chaidh a chleachdadh mar-thà, agus tha seo àbhaisteach. Ach chan urrainnear a leithid de àireamh a sgrìobhadh a-steach do dhuilleagan dàta, oir an ath thuras a gheibh thu cothrom air an duilleag faodaidh e a h-uile ciall a chall.

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

Ma thòisicheas malairt air dàta atharrachadh, thèid àireamh malairt fìor, sònraichte a thoirt dha.

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

=> COMMIT;

Gnìomhan Neadaichte

Sàbhail puingean

Air a mhìneachadh ann an SQL sàbhail puingean (savepoint), a leigeas leat pàirt de ghnothach a chuir dheth gun a bhith a’ cur stad air gu tur. Ach chan eil seo a 'freagairt ris an dealbh gu h-àrd, leis gu bheil an aon inbhe aig a' ghnothach airson a h-uile atharrachadh, agus gu corporra chan eil dàta air a thoirt air ais.

Gus an gnìomh seo a bhuileachadh, tha malairt le puing sàbhalaidh air a roinn ann an grunnan fa leth gnothaichean suidhichte (fo-ghluasad), agus faodar an inbhe aca a riaghladh air leth.

Tha an àireamh aca fhèin aig gnothaichean neadachaidh (nas àirde na àireamh a’ phrìomh ghnothaich). Tha inbhe gnothaichean neadachaidh air a chlàradh san dòigh àbhaisteach ann an XACT, ach tha an inbhe mu dheireadh an urra ri inbhe a’ phrìomh ghnothaich: ma thèid a chuir dheth, thèid a h-uile gnothach neadachaidh a chuir dheth cuideachd.

Tha fiosrachadh mu neadachadh malairt air a stòradh ann am faidhlichean san eòlaire PGDATA/pg_subtrans. Gheibhear cothrom air faidhlichean tro bhufairean ann an cuimhne co-roinnte an t-suidheachaidh, air an eagrachadh san aon dòigh ri bufairean XACT.

Na cuir a-mach gnothaichean neadachaidh le gnothaichean fèin-riaghailteach. Chan eil gnothaichean fèin-riaghlaidh an urra ri chèile ann an dòigh sam bith, ach bidh gnothaichean neadachaidh a’ dèanamh. Chan eil gnothaichean neo-eisimeileach ann am PostgreSQL cunbhalach, agus, is dòcha, airson a 'chuid as fheàrr: tha feum orra glè, glè ainneamh, agus tha an làthaireachd ann an DBMSan eile a' brosnachadh droch dhìol, às a bheil a h-uile duine a 'fulang.

Leig leinn am bòrd a ghlanadh, tòisichidh sinn malairt agus cuir a-steach an loidhne:

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

A-nis cuiridh sinn puing sàbhalaidh agus cuir a-steach loidhne eile.

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

Thoir an aire gu bheil an gnìomh txid_current() a’ tilleadh a’ phrìomh àireamh malairt, chan e an àireamh malairt neadachaidh.

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

Rachamaid air ais chun phuing sàbhalaidh agus cuir a-steach an treas loidhne.

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

Air an duilleag tha sinn a’ leantainn oirnn a’ faicinn an t-sreath air a chur ris leis a’ ghnothach neadachaidh a chaidh a chuir dheth.

Bidh sinn a 'ceartachadh nan atharrachaidhean.

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

A-nis chì thu gu soilleir gu bheil a h-inbhe fhèin aig gach gnothach neadachaidh.

Thoir an aire nach urrainnear gnothaichean neadachaidh a chleachdadh gu sònraichte ann an SQL, is e sin, chan urrainn dhut gnothach ùr a thòiseachadh gun a bhith a’ lìonadh an tè làithreach. Tha an uidheamachd seo air a chuir an gnìomh gu h-obann nuair a bhios tu a’ cleachdadh puingean sàbhalaidh, a bharrachd air nuair a bhios tu a’ làimhseachadh eisgeachdan PL / pgSQL agus ann an grunn chùisean eile, nas iomallaiche.

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

Mearachdan agus atomicity de obrachaidhean

Dè thachras ma thachras mearachd fhad ‘s a tha thu a’ coileanadh gnìomhachd? Mar eisimpleir, mar seo:

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

Tha mearachd air tachairt. A-nis thathas den bheachd gu bheil an gnothach air a stad agus chan eil gnìomhachd sam bith ceadaichte ann:

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

Agus eadhon ged a dh'fheuchas tu ris na h-atharrachaidhean a dhèanamh, bheir PostgreSQL aithris air casg-breith:

=> COMMIT;
ROLLBACK

Carson nach urrainn do ghnothach leantainn air adhart às deidh fàilligeadh? Is e an fhìrinn gum faodadh mearachd èirigh ann an dòigh a gheibheadh ​​​​sinn cothrom air pàirt de na h-atharrachaidhean - atmhorachd chan e eadhon a’ ghnothach, ach bhiodh an gnìomhaiche air a bhriseadh. Mar a tha san eisimpleir againn, far an deach aig a’ ghnìomhaiche air aon loidhne ùrachadh ron mhearachd:

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

Feumar a ràdh gu bheil modh aig psql a leigeas leis a ’ghnothach cumail a’ dol às deidh fàilligeadh mar gum biodh gnìomhan a ’ghnìomhaiche mearachdach air an toirt air ais.

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

Chan eil e duilich a bhith a’ tomhas, anns a’ mhodh seo, gu bheil psql gu dearbh a’ cur puing sàbhalaidh so-thuigsinn ro gach àithne, agus gun fhios nach fàilligeadh e tòiseachadh air tilleadh thuige. Chan eil am modh seo air a chleachdadh gu bunaiteach, leis gu bheil suidheachadh puingean sàbhalaidh (eadhon gun a bhith a’ dol air ais thuca) a’ toirt a-steach cus cus.

Leantainn.

Source: www.habr.com

Cuir beachd ann