Transaksi ing InterSystems IRIS globals

Transaksi ing InterSystems IRIS globalsInterSystems IRIS DBMS ndhukung struktur sing menarik kanggo nyimpen data - global. Ateges, iki minangka kunci multi-level kanthi macem-macem barang tambahan ing wangun transaksi, fungsi cepet kanggo ngliwati wit data, kunci lan basa ObjectScript dhewe.

Waca liyane babagan global ing seri artikel "Globals minangka pedhang kanggo nyimpen data":

Wit-witan. Bagean 1
Wit-witan. Bagean 2
Susunan jarang. Bagean 3

Aku dadi kasengsem ing carane transaksi dileksanakake ing global, fitur apa ana. Sawise kabeh, iki minangka struktur sing beda banget kanggo nyimpen data tinimbang tabel biasa. Tingkat sing luwih murah.

Kaya sing dingerteni saka teori basis data relasional, implementasi transaksi sing apik kudu nyukupi syarat ACID:

A - Atom (atomisitas). Kabeh owah-owahan sing digawe ing transaksi utawa ora ana ing kabeh kacathet.

C - Konsistensi. Sawise transaksi rampung, negara logis database kudu konsisten internal. Akeh cara, syarat iki ana gegayutane karo programmer, nanging ing kasus database SQL uga ana kunci asing.

I - Isolasi. Transaksi sing mlaku bebarengan ora kena pengaruh.

D - awet. Sawise transaksi rampung kanthi sukses, masalah ing tingkat sing luwih murah (umpamane, kegagalan daya) ora bakal mengaruhi data sing diowahi dening transaksi kasebut.

Global minangka struktur data non-relasional. Padha dirancang kanggo mbukak super cepet ing hardware banget winates. Ayo kang katon ing implementasine saka transaksi ing globals nggunakake gambar IRIS docker resmi.

Kanggo ndhukung transaksi ing IRIS, printah ing ngisor iki digunakake: TSTART, TCOMMIT, TROLLBACK.

1. Atomity

Cara paling gampang kanggo mriksa yaiku atomicity. Kita mriksa saka console database.

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

Banjur kita nyimpulake:

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

Kita entuk:

1 2 3

Kabeh apik. Atomisasi dijaga: kabeh owah-owahan dicathet.

Ayo dadi rumit tugas, introduce kesalahan lan ndeleng carane transaksi disimpen, sebagian utawa ora kabeh.

Ayo mriksa atomicity maneh:

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

Banjur kita bakal mandhegake wadhah kasebut kanthi paksa, miwiti lan ndeleng.

docker kill my-iris

Printah iki meh padha karo mateni pasukan, amarga ngirim sinyal SIGKILL kanggo mungkasi proses langsung.

Mungkin transaksi kasebut disimpen sebagian?

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

- Ora, wis ora slamet.

Ayo coba perintah 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)

Ora ana sing slamet uga.

2. Konsistensi

Wiwit ing basis data adhedhasar global, kunci uga digawe ing global (ayo kula ngelingake yen global minangka struktur tingkat ngisor kanggo nyimpen data tinimbang tabel relasional), kanggo nyukupi syarat konsistensi, owah-owahan kunci kudu dilebokake. ing transaksi padha karo owah-owahan ing global.

Contone, kita duwe ^ wong global, ing ngendi kita nyimpen kapribaden lan nggunakake TIN minangka kunci.

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

Kanggo nggoleki kanthi cepet kanthi jeneng mburi lan jeneng ngarep, kita nggawe tombol ^index.

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

Supaya database konsisten, kita kudu nambah persona kaya iki:

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

Dadi, nalika mbusak kita uga kudu nggunakake transaksi:

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

Ing tembung liyane, netepi syarat konsistensi gumantung ing pundhak programmer. Nanging nalika nerangake global, iki normal, amarga sifate tingkat rendah.

3. Isolasi

Iki ngendi wilds miwiti. Akeh pangguna bebarengan nggarap database sing padha, ngganti data sing padha.

Kahanan kasebut bisa dibandhingke nalika akeh pangguna bebarengan nggarap repositori kode sing padha lan nyoba nindakake owah-owahan ing akeh file bebarengan.

Database kudu ngurutake kabeh ing wektu nyata. Ngelingi yen ing perusahaan serius malah ana wong khusus sing tanggung jawab kanggo kontrol versi (kanggo gabung cabang, ngrampungake konflik, lan sapiturute), lan database kudu nindakake kabeh iki ing wektu nyata, kerumitan tugas lan bener. desain database lan kode sing serves.

Basis data ora bisa ngerti makna tumindak sing ditindakake dening pangguna supaya ora konflik yen lagi nggarap data sing padha. Iku mung bisa mbatalake siji transaksi sing konflik karo liyane, utawa nglakokaké sequentially.

Masalah liyane yaiku nalika nglakokake transaksi (sadurunge commit), kahanan database bisa uga ora konsisten, mula luwih becik yen transaksi liyane ora duwe akses menyang negara database sing ora konsisten, sing digayuh ing basis data relasional. kanthi pirang-pirang cara: nggawe jepretan, larik multi-versi lan liya-liyane.

Nalika nindakake transaksi kanthi paralel, penting kanggo kita supaya ora ngganggu saben liyane. Iki minangka properti saka isolasi.

SQL nemtokake 4 tingkat isolasi:

  • BACA TANPA KOMPON
  • READ KOMITTIF
  • REPEATABLE diwaca
  • SERIALIZED

Ayo katon ing saben level kanthi kapisah. Biaya ngleksanakake saben level tuwuh meh sacara eksponensial.

BACA TANPA KOMPON - iki tingkat paling ora isolasi, nanging ing wektu sing padha paling cepet. Transaksi bisa maca owah-owahan sing ditindakake saben liyane.

READ KOMITTIF yaiku tingkat isolasi sabanjure, yaiku kompromi. Transaksi ora bisa maca owah-owahan saben liyane sadurunge commit, nanging bisa maca owah-owahan sing digawe sawise commit.

Yen kita duwe transaksi dawa T1, sajrone nindakake transaksi T2, T3 ... Tn, sing makarya kanthi data sing padha karo T1, banjur nalika njaluk data ing T1, kita bakal entuk asil sing beda saben wektu. Fenomena iki diarani maca sing ora bisa diulang.

REPEATABLE diwaca - ing tingkat isolasi iki, kita ora duwe fenomena maca sing ora bisa diulang, amarga saben panjaluk maca data, gambar saka data asil digawe lan nalika digunakake maneh ing transaksi sing padha, data saka gambar asline. digunakake. Nanging, bisa maca data phantom ing tingkat isolasi iki. Iki nuduhake maca baris anyar sing ditambahake dening transaksi setya paralel.

SERIALIZED - tingkat paling dhuwur saka jampel. Punika ditondoi dening kasunyatan sing data digunakake ing sembarang cara ing transaksi (maca utawa ngganti) dadi kasedhiya kanggo transaksi liyane mung sawise completion saka transaksi pisanan.

Pisanan, ayo ngerteni apa ana pamisahan operasi ing transaksi saka utas utama. Ayo mbukak 2 terminal windows.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Ora ana isolasi. Utas siji ndeleng apa sing ditindakake wong liya sing mbukak transaksi kasebut.

Ayo ndeleng apa transaksi saka macem-macem benang ndeleng apa sing kedadeyan ing njero.

Ayo mbukak 2 terminal windows lan mbukak 2 transaksi kanthi paralel.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Transaksi paralel ndeleng data saben liyane. Dadi, kita entuk tingkat isolasi sing paling gampang, nanging uga paling cepet, READ UNCOMMITED.

Ing asas, iki bisa diarep-arep kanggo global, kang kinerja tansah dadi prioritas.

Kepiye yen kita butuh tingkat isolasi sing luwih dhuwur ing operasi ing global?

Ing kene sampeyan kudu mikir kenapa tingkat isolasi dibutuhake lan cara kerjane.

Tingkat isolasi paling dhuwur, SERIALIZE, tegese asil transaksi sing dieksekusi kanthi paralel padha karo eksekusi urut-urutan, sing njamin ora ana tabrakan.

Kita bisa nindakake iki nggunakake kunci pinter ing ObjectScript, sing duwe macem-macem kegunaan: sampeyan bisa nindakake reguler, incremental, macem-macem ngunci nganggo printah. LOCK.

Tingkat isolasi sing luwih murah minangka trade-off sing dirancang kanggo nambah kacepetan database.

Ayo goleki kepiye carane bisa nggayuh macem-macem tingkat isolasi kanthi nggunakake kunci.

Operator iki ngidini sampeyan njupuk ora mung kunci eksklusif sing dibutuhake kanggo ngganti data, nanging sing diarani kunci sing dienggo bareng, sing bisa njupuk pirang-pirang benang kanthi paralel nalika kudu maca data sing ora kudu diganti dening proses liyane sajrone proses maca.

Informasi luwih lengkap babagan cara pamblokiran rong fase ing basa Rusia lan Inggris:

Bloking rong fase
Pengunci rong fase

Kangelan iku sak transaksi kahanan database bisa inconsistent, nanging data inconsistent iki katon kanggo pangolahan liyane. Carane supaya iki?

Nggunakake kunci, kita bakal nggawe jendhela visibilitas ing ngendi kahanan database bakal konsisten. Lan kabeh akses menyang jendhela visibilitas saka negara sing disepakati bakal dikontrol dening kunci.

Kunci sing dienggo bareng ing data sing padha bisa digunakake maneh - sawetara proses bisa ditindakake. Kunci iki nyegah pangolahan liyane kanggo ngganti data, i.e. padha digunakake kanggo mbentuk windows saka negara database konsisten.

Kunci eksklusif digunakake kanggo owah-owahan data - mung siji proses bisa njupuk kunci kuwi. Kunci eksklusif bisa dijupuk kanthi:

  1. Proses apa wae yen data gratis
  2. Mung proses sing duwe kunci sing dienggo bareng ing data iki lan sing pertama njaluk kunci eksklusif.

Transaksi ing InterSystems IRIS globals

Jendhela visibilitas sing luwih sempit, luwih suwe proses liyane kudu ngenteni, nanging kahanan database sing luwih konsisten.

READ_COMMITTED - Inti saka level iki yaiku kita mung ndeleng data setya saka benang liyane. Yen data ing transaksi liyane durung setya, banjur kita ndeleng versi lawas.

Iki ngidini kita parallelize karya tinimbang ngenteni kunci kanggo dirilis.

Tanpa trik khusus, kita ora bakal bisa ndeleng versi lawas saka data ing IRIS, supaya kita kudu nggawe apa karo kunci.

Dadi, kita kudu nggunakake kunci sing dienggo bareng supaya data bisa diwaca mung nalika konsistensi.

Contone, kita duwe basis pangguna ^ wong sing nransfer dhuwit menyang siji liyane.

Wayahe transfer saka wong 123 menyang wong 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)

Wayahe njaluk jumlah dhuwit saka wong 123 sadurunge debiting kudu diiringi blok eksklusif (kanthi standar):

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

Lan yen sampeyan kudu nuduhake status akun ing akun pribadhi, sampeyan bisa nggunakake kunci sing dienggo bareng utawa ora digunakake:

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

Nanging, yen kita nganggep yen operasi basis data dileksanakake meh langsung (ayo kula ngelingake sampeyan yen global minangka struktur tingkat sing luwih murah tinimbang tabel relasional), mula kebutuhan kanggo level iki suda.

REPEATABLE diwaca - Tingkat isolasi iki ngidini macem-macem maca data sing bisa diowahi kanthi transaksi bebarengan.

Patut, kita kudu sijine kunci sambungan nalika maca data sing diganti lan kunci eksklusif ing data sing diganti.

Begjanipun, operator LOCK ngijini sampeyan kanggo dhaftar rinci kabeh kunci perlu, kang bisa dadi akeh, ing siji statement.

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

operasi liyane (ing wektu iki Utas paralel nyoba ngganti ^ wong (123, jumlah), nanging ora bisa)

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

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

Nalika dhaptar kunci sing dipisahake karo koma, dijupuk kanthi urutan, nanging yen sampeyan nindakake iki:

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

banjur dijupuk kanthi atom bebarengan.

SERIALISE - kita kudu nyetel kunci supaya pungkasane kabeh transaksi sing duwe data umum dieksekusi kanthi urutan. Kanggo pendekatan iki, paling kunci kudu eksklusif lan dijupuk ing wilayah paling cilik ing global kanggo kinerja.

Yen kita pirembagan bab debiting dana ing ^ wong global, banjur mung tingkat isolasi SERIALIZE ditrima kanggo iku, amarga dhuwit kudu ngginakaken strictly sequentially, digunakake iku bisa kanggo nglampahi jumlah sing padha kaping pirang-pirang.

4. Kekiatan

Aku conducted tes karo nglereni hard saka wadhah nggunakake

docker kill my-iris

Dasar ngejarke dheweke kanthi apik. Ora ana masalah sing diidentifikasi.

kesimpulan

Kanggo global, InterSystems IRIS duwe dhukungan transaksi. Dheweke pancen atom lan dipercaya. Kanggo mesthekake konsistensi basis data adhedhasar global, programmer efforts lan nggunakake transaksi dibutuhake, awit iku ora duwe Komplek dibangun ing mbangun kayata tombol manca.

Tingkat isolasi global tanpa nggunakake kunci yaiku READ UNCOMMITED, lan nalika nggunakake kunci bisa dipastiake nganti level SERIALIZE.

Kabeneran lan kacepetan transaksi ing global gumantung banget marang katrampilan programmer: kunci sing dienggo bareng luwih akeh digunakake nalika maca, tingkat isolasi sing luwih dhuwur, lan kunci sing luwih eksklusif dijupuk, luwih cepet kinerja.

Source: www.habr.com

Add a comment