Transaksi di InterSystems IRIS globals

Transaksi di InterSystems IRIS globalsInterSystems IRIS DBMS ngarojong struktur metot pikeun nyimpen data - globals. Intina, ieu konci multi-tingkat kalawan rupa-rupa goodies tambahan dina bentuk transaksi, fungsi gancang pikeun traversing tangkal data, konci jeung basa ObjectScript sorangan.

Maca langkung seueur ngeunaan global dina séri artikel "Globals mangrupikeun harta karun pikeun nyimpen data":

Tatangkalan. Bagian 1
Tatangkalan. Bagian 2
Asép Sunandar Sunarya. Bagian 3

Kuring jadi kabetot dina kumaha transaksi dilaksanakeun di globals, naon fitur aya. Barina ogé, ieu struktur lengkep béda pikeun nyimpen data ti tabel biasa. Tingkat anu langkung handap.

Sakumaha dipikanyaho tina téori database relational, palaksanaan transaksi anu saé kedah nyugemakeun sarat Asid:

A - Atom (atomisitas). Sadaya parobihan anu dilakukeun dina transaksi atanapi henteu aya anu kacatet.

C - Konsistensi. Saatos transaksi réngsé, kaayaan logis tina pangkalan data kedah konsisten sacara internal. Ku sababaraha cara sarat ieu masalah programmer, tapi dina kasus database SQL ogé masalah konci asing.

Kuring - Ngasingkeun. Transaksi anu paralel henteu kedah saling mangaruhan.

D - awét. Saatos parantosan sukses transaksi, masalah dina tingkat handap (kagagalan kakuatan, contona) teu kudu mangaruhan data dirobah ku urus.

Globals mangrupakeun struktur data non-relasional. Éta dirancang pikeun ngajalankeun super gancang dina hardware anu kawates pisan. Hayu urang nempo palaksanaan transaksi di globals ngagunakeun resmi IRIS docker gambar.

Pikeun ngadukung transaksi di IRIS, paréntah di handap ieu dianggo: TSTART, TCOMMIT, TROLLBACK.

1. Atomitas

Cara panggampangna pikeun pariksa nyaéta atomicity. Urang pariksa tina konsol database.

Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMIT

Lajeng urang nyimpulkeun:

Write ^a(1), “ ”, ^a(2), “ ”, ^a(3)

Urang meunang:

1 2 3

Sagalana geus rupa. Atomicity dijaga: sadaya parobahan dirékam.

Hayu urang ngahesekeun tugas, ngenalkeun kasalahan tur tingal kumaha urus disimpen, sawaréh atawa henteu pisan.

Hayu urang pariksa atomicity deui:

Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3

Teras we bakal maksa ngeureunkeun wadahna, ngaluncurkeun sareng ningali.

docker kill my-iris

Paréntah ieu ampir sarua jeung shutdown gaya, sabab ngirimkeun sinyal SIGKILL pikeun ngeureunkeun prosés langsung.

Meureun urus ieu sawaréh disimpen?

WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)

- Henteu, éta henteu salamet.

Hayu urang coba paréntah rollback:

Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TROLLBACK

WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)

Henteu aya anu salamet ogé.

2. Konsistensi

Kusabab dina basis data dumasar kana global, konci ogé dijieun dina globals (hayu kuring ngingetkeun yén global mangrupa struktur tingkat handap pikeun nyimpen data ti tabel relational), pikeun minuhan sarat konsistensi, parobahan konci kudu kaasup. dina urus sarua salaku parobahan dina global.

Salaku conto, urang gaduh ^ jalma global, dimana urang nyimpen kapribadian sareng urang nganggo TIN salaku konci.

^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
...

Dina raraga neangan gancang ku ngaran tukang jeung ngaran hareup, urang nyieun ^ konci indéks.

^index(‘Kamenev’, ‘Sergey’, 1234567) = 1

Supados pangkalan data janten konsisten, urang kedah nambihan persona sapertos kieu:

TSTART
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1
TCOMMIT

Sasuai, nalika ngahapus urang ogé kedah nganggo transaksi:

TSTART
Kill ^person(1234567)
ZKill ^index(‘Kamenev’, ‘Sergey’, 1234567)
TCOMMIT

Dina basa sejen, minuhan sarat konsistensi rests sagemblengna dina taktak programmer urang. Tapi lamun datang ka globals, ieu normal, alatan alam-tingkat low maranéhanana.

3. Isolasi

Ieu dimana wilds dimimitian. Seueur pangguna sakaligus dianggo dina database anu sami, ngarobih data anu sami.

Kaayaanana tiasa dibandingkeun nalika seueur pangguna sakaligus damel sareng gudang kode anu sami sareng nyobian sakaligus ngalakukeun parobihan kana seueur file sakaligus.

Database kedah nyortir sadayana sacara real waktos. Tempo yén di pausahaan serius malah aya jalma husus anu tanggung jawab kontrol versi (pikeun merging cabang, resolving bentrok, jsb), sarta database kudu ngalakukeun sagala ieu sacara real waktu, pajeulitna tugas jeung correctness tina. desain database jeung kode nu ngalayanan eta.

Pangkalan data teu tiasa ngartos hartos tindakan anu dilakukeun ku pangguna pikeun ngahindarkeun konflik upami aranjeunna damel dina data anu sami. Éta ngan ukur tiasa ngabatalkeun hiji transaksi anu bentrok sareng anu sanés, atanapi ngaéksekusi aranjeunna sacara berurutan.

masalah sejen nyaeta nalika dijalankeunnana transaksi (sateuacan commit a), kaayaan database bisa jadi inconsistent, jadi éta desirable yén transaksi sejenna teu boga aksés ka kaayaan inconsistent tina database, nu kahontal dina database relational. ku sababaraha cara: nyieun snapshots, baris multi-versioning jeung sajabana

Nalika ngaéksekusi transaksi paralel, penting pikeun urang yén aranjeunna henteu saling ngaganggu. Ieu sipat isolasi.

SQL nangtukeun 4 tingkat isolasi:

  • BACA UNCOMMITTED
  • BACA DIPAKASAN
  • REPEATABLE DIBACA
  • SERIALIZABLE

Hayu urang nempo unggal tingkat misah. Biaya palaksanaan unggal tingkat tumuwuh ampir éksponénsial.

BACA UNCOMMITTED - Ieu tingkat panghandapna tina isolasi, tapi dina waktos anu sareng panggancangna. Transaksi tiasa maca parobahan anu dilakukeun ku masing-masing.

BACA DIPAKASAN nyaeta tingkat salajengna isolasi, nu kompromi a. Transaksi teu tiasa maca parobahan masing-masing sateuacan komitmen, tapi aranjeunna tiasa maca perobahan anu dilakukeun saatos komitmen.

Lamun urang boga urus lila T1, salila commits lumangsung dina transaksi T2, T3 ... Tn, nu digarap ku data anu sarua sakumaha T1, lajeng nalika requesting data dina T1 urang bakal meunang hasil béda unggal waktu. fenomena ieu disebut non-repeatable bacaan.

REPEATABLE DIBACA - dina tingkat isolasi ieu urang teu boga fenomena bacaan non-repeatable, alatan kanyataan yén pikeun tiap pamundut maca data, snapshot tina hasil data dijieun tur lamun dipaké deui dina transaksi sarua, data tina snapshot nu dipaké. Sanajan kitu, kasebut nyaéta dimungkinkeun pikeun maca data phantom dina tingkat isolasi ieu. Ieu nujul kana maca baris anyar nu ditambahkeun ku transaksi komitmen paralel.

SERIALIZABLE - tingkat pangluhurna insulasi. Hal ieu dicirikeun ku kanyataan yén data dipaké dina sagala cara dina transaksi (maca atawa ngarobah) janten sadia pikeun transaksi sejenna ngan sanggeus parantosan tina transaksi munggaran.

Mimiti, hayu urang terang naha aya isolasi operasi dina urus tina benang utama. Hayu urang muka 2 terminal windows.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Henteu aya isolasi. Hiji benang ningali naon anu dilakukeun ku anu kadua anu muka transaksi.

Hayu urang tingali upami transaksi tina benang anu béda ningali naon anu lumangsung di jerona.

Hayu urang muka 2 terminal windows sareng muka 2 transaksi paralel.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Transaksi paralel ningali data masing-masing. Janten, urang ngagaduhan anu pangbasajanna, tapi ogé tingkat isolasi panggancangna, BACA UNCOMMITED.

Sacara prinsip, ieu tiasa dipiharep pikeun global, anu prestasina sok janten prioritas.

Kumaha upami urang peryogi tingkat isolasi anu langkung luhur dina operasi global?

Di dieu anjeun kedah mikir naha tingkat isolasi diperyogikeun pisan sareng kumaha jalanna.

Tingkat isolasi pangluhurna, SERIALIZE, hartina hasil tina transaksi dieksekusi paralel sarua jeung palaksanaan sequential maranéhna, nu ngajamin henteuna tabrakan.

Urang tiasa ngalakukeun ieu nganggo konci pinter dina ObjectScript, anu gaduh seueur kagunaan anu béda: anjeun tiasa ngalakukeun rutin, incremental, sababaraha konci kalayan paréntah. konci.

Tingkat isolasi handap mangrupakeun trade-offs dirancang pikeun ngaronjatkeun kagancangan database.

Hayu urang tingali kumaha urang tiasa ngahontal tingkat isolasi anu béda-béda nganggo konci.

Operator ieu ngamungkinkeun anjeun nyandak henteu ngan ukur konci ekslusif anu diperyogikeun pikeun ngarobih data, tapi anu disebut konci anu dibagi, anu tiasa nyandak sababaraha benang paralel nalika aranjeunna kedah maca data anu henteu kedah dirobih ku prosés anu sanés nalika prosés maca.

Inpo nu langkung lengkep ihwal metode blocking dua fase dina basa Rusia sareng Inggris:

Blok dua fase
Ngonci dua fase

kasusah teh nya eta salila transaksi kaayaan database bisa jadi inconsistent, tapi data inconsistent ieu katingali ku prosés séjén. Kumaha carana nyingkahan ieu?

Nganggo konci, urang bakal nyiptakeun windows visibilitas dimana kaayaan pangkalan data bakal konsisten. Sareng sadaya aksés kana windows visibilitas sapertos kaayaan anu disatujuan bakal dikontrol ku konci.

Konci anu dibagikeun dina data anu sami tiasa dianggo deui-sababaraha prosés tiasa nyandakana. Konci ieu nyegah prosés séjén tina ngarobah data, i.e. aranjeunna dipaké pikeun ngabentuk jandéla tina kaayaan database konsisten.

Konci ekslusif dianggo pikeun parobahan data - ngan ukur hiji prosés anu tiasa nyandak konci sapertos kitu. Konci ekslusif tiasa dicandak ku:

  1. Proses naon waé upami datana gratis
  2. Ngan prosés anu gaduh konci dibagikeun dina data ieu sareng anu munggaran menta konci ekslusif.

Transaksi di InterSystems IRIS globals

The narrower jandela pisibilitas, beuki lila prosés séjén kudu ngadagoan eta, tapi beuki konsisten kaayaan database di jerona.

READ_COMMITTED - hakekat tingkat ieu urang ningali ukur data komitmen ti threads séjén. Lamun data dina urus sejen teu acan kungsi komitmen, teras urang tingali versi heubeul na.

Hal ieu ngamungkinkeun urang pikeun parallelize karya tinimbang ngantosan konci dileupaskeun.

Tanpa trik husus, urang moal bisa ningali versi heubeul tina data dina IRIS, jadi urang kudu ngalakukeun jeung konci.

Sasuai, urang kedah nganggo konci anu dibagi pikeun ngamungkinkeun data dibaca ngan ukur dina waktos konsistensi.

Anggap urang boga basis pamaké ^ jalma anu mindahkeun duit ka unggal lianna.

Momen mindahkeun tina jalma 123 ka jalma 242:

LOCK +^person(123), +^person(242)
Set ^person(123, amount) = ^person(123, amount) - amount
Set ^person(242, amount) = ^person(242, amount) + amount
LOCK -^person(123), -^person(242)

Momen menta jumlah duit ti jalma 123 saméméh debiting kudu dibarengan ku blok ekslusif (sacara standar):

LOCK +^person(123)
Write ^person(123)

Sareng upami anjeun kedah nunjukkeun status akun dina akun pribadi anjeun, maka anjeun tiasa nganggo konci anu dibagikeun atanapi henteu nganggo éta:

LOCK +^person(123)#”S”
Write ^person(123)

Nanging, upami urang nganggap yén operasi database dilaksanakeun ampir langsung (hayu kuring ngingetkeun yén global mangrupikeun struktur tingkat anu langkung handap tibatan tabel relasional), maka kabutuhan tingkat ieu ngirangan.

REPEATABLE DIBACA - Tingkat isolasi ieu ngamungkinkeun sababaraha bacaan data anu tiasa dirobih ku transaksi sakaligus.

Sasuai, urang kedah nempatkeun konci anu dibagikeun dina maca data anu urang robih sareng konci ekslusif kana data anu urang robih.

Untungna, operator LOCK ngamungkinkeun anjeun daptar sacara rinci sadaya konci anu diperyogikeun, anu tiasa seueur, dina hiji pernyataan.

LOCK +^person(123, amount)#”S”
чтение ^person(123, amount)

operasi séjén (dina ayeuna threads paralel nyoba ngarobah ^ jalma (123, jumlah), tapi teu bisa)

LOCK +^person(123, amount)
изменение ^person(123, amount)
LOCK -^person(123, amount)

чтение ^person(123, amount)
LOCK -^person(123, amount)#”S”

Nalika daptar konci anu dipisahkeun ku koma, aranjeunna dicandak sacara berurutan, tapi upami anjeun ngalakukeun ieu:

LOCK +(^person(123),^person(242))

teras aranjeunna dicandak sacara atom sakaligus.

NGABASA - urang kedah nyetél konci supados pamustunganana sadaya transaksi anu gaduh data umum dieksekusi sacara berurutan. Pikeun pendekatan ieu, seuseueurna konci kedah ekslusif sareng dilaksanakeun di daérah pangleutikna global pikeun pagelaran.

Lamun urang ngobrol ngeunaan debiting dana dina ^ jalma global, mangka ngan tingkat isolasi SERIALIZE bisa ditarima keur eta, saprak duit kudu spent mastikeun sequentially, disebutkeun kasebut nyaéta dimungkinkeun pikeun méakkeun jumlah sarua sababaraha kali.

4. Durability

Kuring ngalaksanakeun tés kalayan motong teuas tina wadahna ngagunakeun

docker kill my-iris

Dasar toléransi aranjeunna ogé. Taya masalah anu dicirikeun.

kacindekan

Pikeun global, InterSystems IRIS gaduh dukungan transaksi. Aranjeunna leres-leres atom sareng dipercaya. Pikeun mastikeun konsistensi database dumasar kana globals, usaha programmer sarta pamakéan transaksi diperlukeun, sabab teu boga kompléks diwangun-di constructs kayaning konci asing.

Tingkat isolasi global tanpa nganggo konci nyaéta READ UNCOMMITED, sareng nalika nganggo konci éta tiasa dipastikeun dugi ka tingkat SERIALIZE.

Kabeneran sareng kagancangan transaksi dina global pisan gumantung kana kaahlian programer: langkung seueur konci anu dianggo nalika maca, langkung luhur tingkat isolasi, sareng konci anu langkung heureut éksklusif dicandak, langkung gancang prestasina.

sumber: www.habr.com

Tambahkeun komentar