1.1 Panimula
At ngayon ang saya ay nagsisimula - ang teorya kung paano gumagana ang mga transaksyon. Paano mapanatiling gumagana ang system kapag binago mo ang parehong data sa iba't ibang mga thread? O gusto mo bang magsagawa ng isang transaksyon sa isa pa? Magsisimula kaming maghanap ng mga sagot sa mga tanong na ito sa pamamagitan ng pag-aaral ng paghihiwalay ng mga transaksyon ...
Ang antas ng paghihiwalay ng transaksyon ay isang kondisyon na halaga na tumutukoy sa lawak kung saan, bilang resulta ng pagpapatupad ng mga lohikal na parallel na transaksyon sa DBMS, pinapayagan ang hindi pantay na data. Ang sukat ng mga antas ng paghihiwalay ng transaksyon ay naglalaman ng ilang halaga, na niraranggo mula sa pinakamababa hanggang sa pinakamataas; ang isang mas mataas na antas ng paghihiwalay ay tumutugma sa mas mahusay na pagkakapare-pareho ng data, ngunit ang paggamit nito ay maaaring mabawasan ang bilang ng mga pisikal na parallel na transaksyon.
Sa kabaligtaran, ang isang mas mababang antas ng paghihiwalay ay nagbibigay-daan para sa higit pang mga parallel na transaksyon, ngunit binabawasan ang katumpakan ng data. Kaya, ang pagpili ng antas ng paghihiwalay ng transaksyon na ginamit, ang nag-develop ng sistema ng impormasyon, sa isang tiyak na lawak, ay nagbibigay ng isang pagpipilian sa pagitan ng bilis ng trabaho at pagtiyak ng garantisadong pagkakapare-pareho ng data na natanggap mula sa system.
Mga problema ng sabay-sabay na pag-access gamit ang mga transaksyon
Kapag ang mga transaksyon ay naisakatuparan nang magkatulad, ang mga sumusunod na problema ay posible:
- nawalang pag-update - kung ang isang bloke ng data ay binago nang sabay-sabay ng iba't ibang mga transaksyon, mawawala ang lahat ng mga pagbabago, maliban sa huli;
- "marumi" na pagbabasa (eng. Dirty read) - pagbabasa ng data na idinagdag o binago ng isang transaksyon, na sa dakong huli ay hindi makukumpirma (rolled back);
- non-repeatable read (eng. non-repeatable read) - kapag muling nagbabasa sa loob ng parehong transaksyon, binago ang dati nang nabasang data;
- phantom reads - isang transaksyon sa panahon ng pagpapatupad nito nang maraming beses na pumipili ng maraming mga hilera ayon sa parehong pamantayan. Ang isa pang transaksyon sa pagitan ng mga pagkuha na ito ay nagdaragdag ng mga row o nagbabago ng mga column ng ilan sa mga row na ginamit sa pamantayan sa pagkuha ng unang transaksyon at matagumpay na natapos. Bilang resulta, lalabas na ang parehong mga pagpipilian sa unang transaksyon ay nagbibigay ng iba't ibang hanay ng mga hilera.
Isaalang-alang ang mga sitwasyon kung saan maaaring mangyari ang mga problemang ito.
1.2 Nawalang update
Ang sitwasyon kung kailan, kapag ang isang bloke ng data ay binago nang sabay-sabay ng iba't ibang mga transaksyon, nawala ang isa sa mga pagbabago.
Ipagpalagay na mayroong dalawang transaksyon na tumatakbo sa parehong oras:
Transaksyon 1 | Transaksyon 2 |
---|---|
I-UPDATE ang tbl1 SET f2=f2+20 SAAN f1=1; | I-UPDATE ang tbl1 SET f2=f2+25 SAAN f1=1; |
Sa parehong mga transaksyon, nagbabago ang halaga ng field ng f2; kapag nakumpleto na, dapat tumaas ng 45 ang halaga ng field. Sa katunayan, maaaring mangyari ang sumusunod na pagkakasunud-sunod ng mga aksyon:
- Ang parehong mga transaksyon ay sabay na nagbabasa ng kasalukuyang estado ng field. Ang eksaktong pisikal na pagkakatugma ay hindi kinakailangan dito, ito ay sapat na ang pangalawang read operation sa pagkakasunud-sunod ay nakumpleto bago ang isa pang transaksyon ay nagsusulat ng resulta nito.
- Kinakalkula ng parehong mga transaksyon ang bagong halaga ng field sa pamamagitan ng pagdaragdag ng 20 at 25, ayon sa pagkakabanggit, sa dating nabasang halaga.
- Sinusubukan ng mga transaksyon na isulat ang resulta ng pagkalkula pabalik sa field f2. Dahil imposibleng pisikal na magsagawa ng dalawang pagsusulat sa parehong oras, sa katotohanan ang isa sa mga operasyon sa pagsulat ay isasagawa nang mas maaga, ang isa pa sa ibang pagkakataon. Ang pangalawang write operation ay papatungan ang resulta ng una.
Bilang resulta, ang halaga ng f2 field, sa pagkumpleto ng parehong mga transaksyon, ay maaaring tumaas hindi ng 45, ngunit sa pamamagitan ng 20 o 25, iyon ay, ang isa sa mga transaksyon sa pagbabago ng data ay "mawawala".
1.3 "Dirty" na pagbabasa
Pagbabasa ng data na idinagdag o binago ng isang transaksyon na sa ibang pagkakataon ay mabibigo na gawin (rollback).
Ipagpalagay na mayroon kaming dalawang transaksyon na binuksan ng magkaibang mga application na nagpapatupad ng mga sumusunod na SQL statement:
Transaksyon 1 | Transaksyon 2 |
---|---|
I-UPDATE ang tbl1 SET f2=f2+1 SAAN f1=1; | |
PUMILI ng f2 MULA sa tbl1 SAAN f1=1; | |
ROLLBACK WORK; |
Sa transaksyon 1, ang halaga ng field f2 ay binago, at pagkatapos ay sa transaksyon 2, ang halaga ng field na ito ay pinili. Pagkatapos nito, ibabalik ang transaksyon 1. Bilang resulta, ang halaga na natanggap ng pangalawang transaksyon ay mag-iiba sa halagang nakaimbak sa database.
1.4 Hindi nauulit na pagbasa
Ang sitwasyon kung kailan, kapag muling nagbabasa sa loob ng parehong transaksyon, ang dating nabasang data ay lumalabas na nabago.
Ipagpalagay na mayroon kaming dalawang transaksyon na binuksan ng magkaibang mga application na nagpapatupad ng mga sumusunod na SQL statement:
Transaksyon 1 | Transaksyon 2 |
---|---|
PUMILI ng f2 MULA sa tbl1 SAAN f1=1; | |
I-UPDATE ang tbl1 SET f2=f2+3 SAAN f1=1; | |
COMMIT; | |
PUMILI ng f2 MULA sa tbl1 SAAN f1=1; |
Sa transaksyon 2, ang halaga ng field f2 ay pinili, pagkatapos ay sa transaksyon 1, ang halaga ng field f2 ay binago. Kung susubukan mong muli na pumili ng value mula sa field f2 sa transaksyon 2, ibang resulta ang makukuha. Ang sitwasyong ito ay lalong hindi katanggap-tanggap kapag ang data ay binasa upang bahagyang baguhin ito at isulat ito pabalik sa database.
1.5 Pagbasa ng "mga multo"
Ang sitwasyon kung kailan, sa paulit-ulit na pagbabasa sa loob ng parehong transaksyon, ang parehong seleksyon ay nagbibigay ng iba't ibang hanay ng mga hilera.
Ipagpalagay na mayroong dalawang transaksyon na binuksan ng magkakaibang mga application na nagpapatupad ng mga sumusunod na SQL statement:
Transaksyon 1 | Transaksyon 2 |
---|---|
PUMILI NG SUM(f2) MULA sa tbl1; | |
INSERT IN TO tbl1 (f1,f2) VALUES(15,20); | |
COMMIT; | |
PUMILI NG SUM(f2) MULA sa tbl1; |
Ang Transaksyon 2 ay nagpapatupad ng isang SQL statement na gumagamit ng lahat ng mga halaga ng field f2. Pagkatapos ay may ipinasok na bagong row sa transaksyon 1, na nagiging sanhi ng muling pagpapatupad ng SQL statement sa transaksyon 2 upang makagawa ng ibang resulta. Ang sitwasyong ito ay tinatawag na phantom reading (phantom reading). Naiiba ito sa hindi nauulit na pagbabasa dahil nagbago ang resulta ng paulit-ulit na pag-access sa data hindi dahil sa pagbabago/pagtanggal ng data mismo, ngunit dahil sa paglitaw ng bagong (phantom) na data.