Гүйлгээ ба тэдгээрийн хяналтын механизм

Ажил гүйлгээ

Гүйлгээ нь эхлэл ба төгсгөлтэй өгөгдөл дээр хийх үйлдлийн дараалал юм.

Гүйлгээ гэдэг нь унших, бичих үйлдлүүдийн дараалсан гүйцэтгэл юм. Гүйлгээний төгсгөл нь өөрчлөлтийг хадгалах (амлалт) эсвэл өөрчлөлтийг цуцлах (буцах) байж болно. Өгөгдлийн сангийн хувьд гүйлгээ нь нэг хүсэлт гэж тооцогдох хэд хэдэн хүсэлтээс бүрдэнэ.

Гүйлгээ нь ACID шинж чанарыг хангасан байх ёстой

Атом чанар. Гүйлгээ бүрэн дууссан эсвэл огт дуусаагүй байна.

Тууштай байдал. Гүйлгээг дуусгахдаа өгөгдөлд тавьсан хязгаарлалтыг (жишээлбэл, мэдээллийн сан дахь хязгаарлалт) зөрчиж болохгүй. Тогтвортой байдал нь системийг нэг зөв төлөвөөс нөгөө зөв төлөвт шилжүүлнэ гэсэн үг юм.

Тусгаарлалт. Зэрэгцээ явагдаж байгаа гүйлгээ нь бие биедээ нөлөөлөх ёсгүй, жишээлбэл, өөр гүйлгээнд ашигласан өгөгдлийг өөрчлөх. Зэрэгцээ гүйлгээг гүйцэтгэх үр дүн нь гүйлгээг дараалан гүйцэтгэсэнтэй ижил байх ёстой.

Тогтвортой байдал. Нэгэнт хийсэн өөрчлөлтүүд алдагдах ёсгүй.

Гүйлгээний бүртгэл

Бүртгэл нь гүйлгээгээр хийгдсэн өөрчлөлтүүдийг хадгалж, системийн эвдрэл гарсан тохиолдолд өгөгдлийн атом, тогтвортой байдлыг баталгаажуулдаг

Бүртгэл нь гүйлгээгээр өөрчлөгдсөнөөс өмнө болон дараа нь өгөгдөлд байсан утгыг агуулдаг. Урьдчилан бичих бүртгэлийн стратеги нь эхлэхээс өмнө өмнөх утгууд болон гүйлгээ дууссаны дараа эцсийн утгуудын талаар бүртгэлийн оруулга нэмэх шаардлагатай. Систем гэнэт зогссон тохиолдолд мэдээллийн сан нь бүртгэлийг урвуу дарааллаар уншиж, гүйлгээгээр хийсэн өөрчлөлтийг хүчингүй болгодог. Тасалдсан гүйлгээтэй тулгарсны дараа өгөгдлийн сан үүнийг хийж, бүртгэлд өөрчлөлт оруулдаг. Алдаа гарах үед төлөв байдалд байгаа тул мэдээллийн сан нь бүртгэлийг дарааллаар нь уншиж, гүйлгээний хийсэн өөрчлөлтийг буцаана. Ингэснээр аль хэдийн хийгдсэн гүйлгээний тогтвортой байдал, тасалдсан гүйлгээний атом шинж чанар хадгалагдана.

Амжилтгүй болсон гүйлгээг дахин хийх нь нөхөн сэргээхэд хангалтгүй юм.

Жишээ. Хэрэглэгчийн дансанд 500 доллар байгаа бөгөөд хэрэглэгч үүнийг АТМ-аас авахаар шийддэг. Хоёр гүйлгээ хийгдэж байна. Эхнийх нь үлдэгдлийн үнэ цэнийг уншиж, хэрэв үлдэгдэлд хангалттай мөнгө байгаа бол хэрэглэгчдэд мөнгө олгоно. Хоёр дахь нь үлдэгдэлээс шаардлагатай дүнг хасна. Систем гацаж, эхний үйлдэл амжилтгүй болсон гэж бодъё, харин хоёр дахь нь бүтэлгүйтсэн. Энэ тохиолдолд бид эерэг үлдэгдэлтэй системийг анхны байдалд нь оруулахгүйгээр хэрэглэгчдэд дахин мөнгө олгох боломжгүй.

Тусгаарлалтын түвшин

Committed-ийг уншина уу

Бохир уншлагын асуудал нь гүйлгээ нь өөр гүйлгээний завсрын үр дүнг уншиж чаддагт оршино.

Жишээ. Анхны үлдэгдэл үнэ нь $0 байна. T1 таны үлдэгдэлд 50 доллар нэмнэ. T2 балансын утгыг уншина ($50). T1 өөрчлөлтийг устгаж, гарна. T2 үлдэгдэл буруу өгөгдөлтэй гүйцэтгэлээ үргэлжлүүлсээр байна.

Энэхүү шийдэл нь гүйлгээгээр өөрчилсөн өгөгдлийг уншихыг хориглодог тогтмол өгөгдлийг унших (Read Committed) юм. Хэрэв А гүйлгээ тодорхой багц өгөгдлийг өөрчилсөн бол В гүйлгээ нь энэ өгөгдөлд хандахдаа А гүйлгээг дуусгахыг хүлээхээс өөр аргагүй болно.

Давтан унших

Алдагдсан шинэчлэлтийн асуудал. T1 нь T2-ийн өөрчлөлтүүдийн дээр өөрчлөлтүүдийг хадгалдаг.

Жишээ. Эхний үлдэгдлийн утга нь $0 бөгөөд хоёр гүйлгээ нэгэн зэрэг үлдэгдлийг нөхдөг. T1 ба T2 нь 0 долларын үлдэгдлийг уншдаг. Дараа нь T2 $ 200-г $ 0-д нэмээд үр дүнг хадгална. T1 нь $100-г $0-д нэмээд үр дүнг хадгална. Эцсийн үр дүн нь 100 доллар биш 300 доллар юм.

Уншихад давтагдахгүй асуудал. Нэг өгөгдлийг дахин дахин уншихад өөр утгууд гарч ирдэг.

Жишээ. T1 нь 0 долларын балансын утгыг уншдаг. Дараа нь T2 нь үлдэгдэл дээр 50 доллар нэмээд дуусна. T1 нь өгөгдлийг дахин уншиж, өмнөх үр дүнтэй зөрүүг олдог.

Давтан унших нь хоёр дахь удаагаа уншихад ижил үр дүн гарах болно. Нэг гүйлгээгээр уншсан өгөгдлийг бусад гүйлгээг дуусгах хүртэл өөрчлөх боломжгүй. Хэрэв А гүйлгээ тодорхой багц өгөгдлийг уншсан бол В гүйлгээ нь энэ өгөгдөлд хандахдаа А гүйлгээг дуусгахыг хүлээхээс өөр аргагүй болно.

Захиалгат унших (цуваалах боломжтой)

Phantom Reads-ийн асуудал. Тодорхой нөхцөл дээр үндэслэн өгөгдлийг сонгосон хоёр асуулга өөр өөр утгыг буцаана.

Жишээ. T1 нь үлдэгдэл нь 0 доллараас их боловч 100 доллараас бага бүх хэрэглэгчдийн тоог шаарддаг. T2 нь 1 долларын үлдэгдэлтэй хэрэглэгчээс 101 долларыг хасдаг. T1 хүсэлтийг дахин гаргадаг.

Захиалгат унших (цуваалах боломжтой). Гүйлгээг бүрэн дарааллаар гүйцэтгэдэг. Хүсэлтийн нөхцөлд нийцсэн бүртгэлийг шинэчлэх, нэмэхийг хориглоно. Хэрэв А гүйлгээ нь бүх хүснэгтээс өгөгдөл хүссэн бол А гүйлгээ дуусах хүртэл бусад гүйлгээний хувьд хүснэгтийг бүхэлд нь царцаана.

Хуваарьлагч

Зэрэгцээ гүйлгээний үед ямар үйлдлүүдийг гүйцэтгэх дарааллыг тогтооно.

Тусгаарлалтын тодорхой түвшинг хангана. Хэрэв үйлдлүүдийн үр дүн нь тэдгээрийн дарааллаас хамаарахгүй бол ийм үйлдлүүд нь солигддог (Permutable). Унших үйлдлүүд болон өөр өөр өгөгдөл дээрх үйлдлүүд нь солигддог. Унших-бичих, бичих-бичих үйлдлүүд нь солигддоггүй. Төлөвлөгчийн үүрэг бол гүйцэтгэлийн үр дүн нь гүйлгээний дараалсан гүйцэтгэлтэй тэнцүү байхын тулд зэрэгцээ гүйлгээний гүйцэтгэсэн үйлдлүүдийг хооронд нь үлдээх явдал юм.

Зэрэгцээ ажлыг хянах механизм (Зэрэгцээ хяналт)

Өөдрөг үзэл нь зөрчилдөөнийг илрүүлэх, шийдвэрлэхэд, гутранги үзэл нь зөрчилдөөн үүсэхээс урьдчилан сэргийлэхэд суурилдаг.

Өөдрөг хандлагад олон хэрэглэгчид мэдээллийн хуулбарыг эзэмшдэг. Засвар хийж дуусгасан эхний хүн өөрчлөлтийг хадгалдаг бол бусад нь өөрчлөлтийг нэгтгэх ёстой. Өөдрөг алгоритм нь зөрчилдөөн үүсэх боломжийг олгодог боловч систем зөрчилдөөнөөс сэргэх ёстой.

Гутранги хандлагатай бол өгөгдлийг хамгийн түрүүнд авсан хэрэглэгч бусдыг мэдээлэл хүлээн авахаас сэргийлдэг. Хэрэв зөрчилдөөн ховор тохиолддог бол өөдрөг стратегийг сонгох нь ухаалаг хэрэг болно, учир нь энэ нь илүү өндөр түвшний уялдаа холбоог өгдөг.

Түгжих

Хэрэв нэг гүйлгээ түгжигдсэн өгөгдөлтэй бол бусад гүйлгээ нь өгөгдөлд хандахдаа түгжээг нь тайлах хүртэл хүлээх ёстой.

Блокыг мэдээллийн сан, хүснэгт, мөр, атрибут дээр давхарлаж болно. Хуваалцсан түгжээг ижил өгөгдөлд хэд хэдэн гүйлгээгээр ногдуулах боломжтой бөгөөд бүх гүйлгээг (түүний дотор үүнийг ногдуулсан) уншихыг зөвшөөрдөг, өөрчлөх, онцгойлон авахыг хориглодог. Онцгой түгжээг зөвхөн нэг гүйлгээгээр ногдуулах боломжтой, ногдуулсан гүйлгээний аливаа үйлдлийг зөвшөөрөх, бусдын аливаа үйлдлийг хориглоно.

Гүйлгээ нь тодорхойгүй хугацаагаар хүлээгдэж буй төлөвт дуусдаг нөхцөл байдлыг мухардмал гэж нэрлэдэг.

Жишээ. Эхний гүйлгээ нь хоёр дахь нь авсан өгөгдлийг гаргахыг хүлээж байхад хоёр дахь нь эхнийх нь авсан өгөгдлийг гаргахыг хүлээнэ.

Гацааны асуудлыг өөдрөгөөр шийдэх нь гацаа үүсэх боломжийг олгодог боловч дараа нь гацсан гүйлгээний аль нэгийг буцаах замаар системийг сэргээдэг.

Түгжээг тодорхой интервалаар хайдаг. Илрүүлэх аргуудын нэг нь цаг хугацааны хувьд, өөрөөр хэлбэл гүйлгээг дуусгахад хэтэрхий удаж байвал мухардмал байдалд орсон гэж үзэх явдал юм. Гацаа илэрсэн тохиолдолд гүйлгээний аль нэгийг буцаах бөгөөд энэ нь гацаад орсон бусад гүйлгээг дуусгах боломжийг олгоно. Хохирогчийг сонгохдоо гүйлгээний үнэ цэнэ эсвэл тэдгээрийн ахмад настаас хамаарч болно (Хүлээ-Үхэх ба Шарх-хүлээлтийн схем).

Гүйлгээ бүр T цагийн тэмдэг өгөгдсөн TS гүйлгээ эхлэх цагийг агуулсан.

Хүлээгээрэй - Үх.

бол TS(Ti) < TS(Tj)Дараа нь Ti хүлээж байна, үгүй ​​бол Ti буцаж эргэлдэж, ижил цагийн тэмдэгээр дахин эхэлнэ.

Хэрэв залуу гүйлгээ эх сурвалжийг олж авсан бол хуучин гүйлгээ нь ижил эх сурвалжийг хүссэн бол хуучин гүйлгээг хүлээхийг зөвшөөрнө. Хэрэв хуучин гүйлгээ нь нөөц олж авсан бол тухайн нөөцийг хүссэн залуу гүйлгээг буцаах болно.

Хүлээгээрэй.

бол TS(Ti) < TS(Tj)Дараа нь Tj буцаж эргэлдэж, ижил цагийн тэмдэгээр дахин эхэлнэ, үгүй ​​бол Ti хүлээж байна.

Хэрэв залуу гүйлгээ эх сурвалжийг олж авсан бол хуучин гүйлгээ нь ижил эх сурвалжийг хүссэн бол залуу гүйлгээг буцаах болно. Хэрэв хуучин гүйлгээ нь нөөц олж авсан бол тухайн нөөцийг хүссэн залуу гүйлгээг хүлээхийг зөвшөөрнө. Давуу эрхэд суурилсан хохирогчийг сонгох нь мухардалд орохоос сэргийлж, харин мухардаагүй гүйлгээг буцаах болно. Асуудал нь гүйлгээг олон удаа буцааж болно, учир нь... хуучин гүйлгээ нь нөөцийг удаан хугацаанд хадгалж болно.

Гацааны асуудлын гутранги шийдэл нь мухардалд орох эрсдэлтэй тохиолдолд гүйлгээг хийж эхлэхийг зөвшөөрдөггүй.

Гацааг илрүүлэхийн тулд графикийг (хүлээлтийн график, хүлээлтийн график) байгуулдаг бөгөөд оройнууд нь гүйлгээ бөгөөд ирмэгүүд нь өгөгдөл гарахыг хүлээж буй гүйлгээнээс энэ өгөгдлийг барьж авсан гүйлгээ рүү чиглүүлдэг. График гогцоотой бол мухардалд орсон гэж үзнэ. Хүлээлтийн график, ялангуяа тархсан мэдээллийн санд байгуулах нь үнэтэй процедур юм.

Хоёр фазын түгжээ - гүйлгээний эхэнд гүйлгээнд ашигласан бүх нөөцийг хураан авч, эцэст нь чөлөөлөх замаар түгжрэл үүсэхээс сэргийлдэг.

Бүх блоклох үйлдлүүд нь эхний түгжээг тайлахаас өмнө байх ёстой. Энэ нь хоёр үе шаттай - Өсгөх үе шат, энэ үед бариул хуримтлагддаг ба агшилтын үе шат бөгөөд энэ үед бариулууд суллагдана. Хэрэв нөөцийн аль нэгийг олж авах боломжгүй бол гүйлгээ дахин эхэлнэ. Хэд хэдэн ажил гүйлгээ ижил нөөцийн төлөө өрсөлдөж байгаа тохиолдолд гүйлгээ шаардлагатай нөөцийг олж авах боломжгүй байх магадлалтай.

Хоёр үе шаттай үүрэг даалгавар нь өгөгдлийн сангийн бүх хуулбар дээр биелэгдэхийг баталгаажуулдаг

Мэдээллийн сан бүр өөрчлөлт хийх өгөгдлийн талаарх мэдээллийг бүртгэлд оруулж, зохицуулагч OK (Санал хураах үе шат) -д хариу өгнө. Бүгд OK гэж хариулсны дараа зохицуулагч дохио илгээж, хүн бүрийг үүрэг даалгавар өгнө. Үйлчлүүлсний дараа серверүүд OK гэж хариулдаг; хэрэв дор хаяж нэг нь OK гэж хариу өгөхгүй бол зохицуулагч бүх серверт хийсэн өөрчлөлтийг цуцлах дохиог илгээдэг (Төгсгөлийн үе шат).

Цагийн тэмдэгтийн арга

Залуу гүйлгээний өгөгдөлд хандах оролдлого хийх үед хуучин гүйлгээг буцаах болно

Гүйлгээ бүрт цагийн тэмдэг оноогдсон TS гүйцэтгэлийн эхлэх цагтай тохирч байна. Хэрэв Ti дээгүүр TjДараа нь TS(Ti) < TS(Tj).

Гүйлгээг буцаах үед түүнд шинэ цагийн тэмдэг оноодог. Өгөгдлийн объект бүр Q гүйлгээнд оролцсон хоёр шошготой байна. W-TS(Q) — рекорд амжилттай дууссан хамгийн залуу гүйлгээний цагийн тэмдэг Q. R-TS(Q) — уншсан бичлэг хийсэн хамгийн залуу гүйлгээний цагийн тэмдэг Q.

Гүйлгээ хийх үед T өгөгдөл унших хүсэлт Q Хоёр сонголт байна.

бол TS(T) < W-TS(Q), өөрөөр хэлбэл, өгөгдлийг залуу гүйлгээ, дараа нь гүйлгээгээр шинэчилсэн T буцаж эргэлддэг.

бол TS(T) >= W-TS(Q), дараа нь унших ажиллагаа хийгдэх ба R-TS(Q) болж байна MAX(R-TS(Q), TS(T)).

Гүйлгээ хийх үед T өгөгдөлд өөрчлөлт оруулах хүсэлт гаргадаг Q Хоёр сонголт байна.

бол TS(T) < R-TS(Q), өөрөөр хэлбэл, өгөгдлийг аль хэдийн залуу гүйлгээ уншсан бөгөөд хэрэв өөрчлөлт хийвэл зөрчил үүснэ. Гүйлгээ T буцаж эргэлддэг.

бол TS(T) < W-TS(Q), өөрөөр хэлбэл, гүйлгээ нь шинэ утгыг дарж бичихийг оролдох үед T гүйлгээг буцаах болно. Бусад тохиолдолд өөрчлөлтийг хийдэг ба W-TS(Q) тэнцүү болдог TS(T).

Ямар ч үнэтэй хүлээлгийн график барих шаардлагагүй. Хуучин гүйлгээ нь шинэ гүйлгээнээс хамаардаг тул хүлээх графикт ямар ч мөчлөг байхгүй. Гүйлгээг хүлээгээгүй, нэн даруй буцаадаг тул гацаа байхгүй. Үе шаттайгаар буцаах боломжтой. Хэрэв Ti өнхөрчихсөн ба Tj Би өөрчилсөн өгөгдлийг уншсан TiДараа нь Tj бас буцах ёстой. Хэрэв нэгэн зэрэг Tj нэгэнт үйлдсэн бол тогтвортой байх зарчим зөрчигдөнө.

Какадын буцаах шийдлүүдийн нэг. Гүйлгээ нь эцэст нь бичих бүх үйлдлүүдийг дуусгах ба бусад гүйлгээ нь тухайн үйлдлийг дуусгахыг хүлээх ёстой. Гүйлгээ уншихаас өмнө хийгдэхийг хүлээдэг.

Томас бичих дүрэм - залуу гүйлгээгээр шинэчлэгдсэн өгөгдлийг хуучин гүйлгээгээр дарж бичихийг хориглодог цагийн тэмдгийн аргын өөрчлөлт

Гүйлгээ T өгөгдөлд өөрчлөлт оруулах хүсэлт гаргадаг QБайна. Хэрэв TS(T) < W-TS(Q), өөрөөр хэлбэл, гүйлгээ нь шинэ утгыг дарж бичихийг оролдох бөгөөд T гүйлгээг цагийн тэмдгийн аргын адил буцаахгүй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх