Кіріспе

Деректер базасы транзакцияларының қасиеттері жиынтығы

Компьютерлік ғылымда ACID (атомдық, сәйкестік, оқшаулану, беріктік) – қателерге, қуат үзілуіне және басқа да жағдайларға қарамастан деректердің дұрыстығына кепілдік беруге бағытталған деректер базасы транзакцияларының қасиеттері жиынтығы. Деректер базасы контекстінде, ACID қасиеттерін қанағаттандыратын (деректердегі бір логикалық операция ретінде қарастырылатын) деректер базасы операцияларының тізбегі транзакция деп аталады. Мысалы, бір банк шотынан екіншісіне қаражат аудару, тіпті бір шотынан соманы алу және екіншісіне қосу сияқты бірнеше өзгерістерді қамтитын болса да, ол бір транзакция болып саналады. 1983 жылы Андреас Ройтер және Тео Хердер бұрынғы Джим Грейдің транзакция тұжырымын сипаттағанда атомдық, сәйкестік және беріктік аталымдарын қолданған, бірақ оқшаулануды атамаған, соның негізінде ACID аббревиатурасын жасады. Бұл төрт қасиет – деректер базасы жүйелерінің дамуының көптеген саласына әсер еткен транзакция парадигмасының маңызды кепілдіктері болып табылады. Грей мен Ройтердің сөзіне сүйенсек, IBM ақпараттық жүйесі 1973 жылдан бастап ACID транзакцияларын қолдаған (дегенмен, аббревиатура кейін пайда болған).

Атомдық

Транзакциялар көбінесе бірнеше операциядан тұрады. Атомдық қасиет әрбір транзакцияның бір "бүтін" ретінде қарастырылатынын қамтамасыз етеді, яғни ол толығымен орындалады немесе толығымен орындалмайды: егер транзакция құрамына кіретін операциялардың біреуі аяқталмаса, бүкіл транзакция сәтсіз аяқталады және деректер базасы өзгеріссіз қалады. Атомдық жүйе электр қуатының үзілуі, қателер және жүйелік қателер сияқты кез келген жағдайда атомдық қасиетті сақтауға тиіс. Атомдық қасиеттің болуы деректер базасына жаңартулардың толық емес орындалуына жол бермейді, бұл бүкіл транзакцияны бірден қабылдамаудан да қауіпті проблемаларға әкелуі мүмкін. Соның салдарынан, басқа деректер базасы қолданушысы транзакцияның орындалып жатқанын байқамайды. Бір сәтте ол әлі басталмаған, ал келесі сәтте ол толығымен орындалған (немесе транзакция тоқтатылса, ештеңе орындалмаған).

Бірқалыптылық

Тұрақтылық транзакцияның дерекқорды бір тұрақты күйден екінші тұрақты күйге ғана көшіретінін және дерекқор инварианттарын сақтайтынын қамтамасыз етеді: дерекқорға жазылған кез келген дерек, шектеулер, каскадтар, триггерлер және олардың кез келген комбинациясын қоса алғанда, барлық анықталған ережелерге сәйкес жарамды болуы керек. Бұл заңсыз транзакция нәтижесінде дерекқордың бұзылуына жол бермейді. Сілтемелік тұтастық негізгі кілт пен сыртқы кілт арасындағы қатынасты қамтамасыз етеді.

Оқшаулау

Транзакциялар көбінесе бір мезгілде орындалады (мысалы, бірнеше транзакция бір уақытта кестеден деректерді оқып немесе жазып жатуы мүмкін). Оқшаулау, транзакциялардың бір мезгілде орындалуы деректер базасын транзакциялар тізбектей орындалғандағыдай бірдей күйде қалдыруын қамтамасыз етеді. Оқшаулау – бір мезгілде орындауды басқарудың басты мақсаты; қолданылған оқшаулау деңгейіне байланысты, аяқталмаған транзакцияның әсері басқа транзакцияларға көрінбей қалуы мүмкін.

Ұзаққа созылмалылық

Тұрақтылық – транзакция орындалғаннан кейін, жүйе іркілген жағдайда да (мысалы, қуат өшірілуі немесе құлау) оның орындалғандығы сақталады деген кепілдік береді. Әдетте, орындалған транзакциялардың (немесе олардың нәтижелерінің) мәліметтері ұдайы сақталынатын жадқа жазылады.

Мысалдар

Келесі мысалдар АСИД қасиеттерін одан әрі түсіндіреді. Бұл мысалдарда деректер базасының кестесінде екі баған бар: А және В. Тұтастық шектеуі А және В бағандарындағы мәндердің қосындысы 100-ге тең болуын талап етеді. Төмендегі SQL коды жоғарыда сипатталған кестені құрайды: CREATE TABLE acidtest (A INTEGER, B INTEGER, CHECK (A + B = 100));

Атомдық

Атомдық – атомдық транзакциядағы деректер базасы операцияларының тізбегінің толығымен орындалуына (сәтті операция) немесе мүлдем орындалмауына (сәтсіз операция) кепілдік береді. Операциялар тізбегін бөліп-жару мүмкін емес, олардың бір бөлігі ғана орындалады, бұл тізбекті "бөлінбес" етеді. Атомдық кепілдік деректер базасын жаңартудың толық емес орындалуына жол бермейді, бұл бүкіл тізбекті бірден қабылдамаудан да қауіптірек болуы мүмкін. Басқаша айтқанда, атомдық – бұл бөлінбеушілік және толықтығын жоғалту мүмкін еместігі. Сондай-ақ, логикалық транзакция бірнеше физикалық транзакциядан тұруы мүмкін. Барлық құрамдас физикалық транзакциялар орындалғанша, логикалық транзакция орындалмайды. Атомдық транзакцияға мысал – А банктік шотынан В банктік шотына ақша аудару. Ол екі операциядан тұрады: А шотынан ақшаны алу және В шотына салу. Ақша А шотынан алынғанын, оның В шотына аударылғанына көз жеткізбейінше біз көруге ішін тырыспаймыз. Осы операцияларды атомдық транзакция ретінде орындау деректер базасының дұрыс күйде қалуын қамтамасыз етеді, яғни егер осы екі операцияның бірі сәтсіз аяқтаса, ақша дебеттелмейді немесе кредиттелмейді.

Біркелкілік жетіспеушілігі

Тұтастылық – өте жалпы термин, ол деректердің барлық тексеру ережелеріне сәйкес келуін қажет етеді. Алдыңғы мысалда, тексеру – барлық тексеру ережелерін тұтастықты қамтамасыз ету үшін тексеру талабы. Егер транзакция өзгеріссіз 10-ды алып тастауға тырысса, онда ол бастапқы күйінде қалады. Егер транзакция 10-ды сәтті алып тастаса, атомдыққа қол жеткізіледі. Дегенмен, тексеру нәтижесі көрсетер, бұл дерекқорының ережелеріне қайшы келеді. Соның салдарынан, транзакция толығымен жойылмалы және әсер еткен қатарлар транзакциядан бұрынғы күйіне қайтарылмалы. Егер басқа шектеулер, триггерлер немесе каскадтар болғанда, әрбір өзгерту операциясы транзакция бекітілмес бұрын жоғарыда аталғандай тексерілер еді. Басқа шектеулермен де ұқсас мәселелер туындауы мүмкін. Мысалы, екі мәннің де дерек типі бүтін сан болуы керек. Егер біз мәні ретінде 13,5 енгізсек, транзакция жойылған болар еді немесе жүйе триггер арқылы ескерту берер еді (егер триггер осы мақсатта жазылған болса). Тағы бір мысал – тұтастық шектеулері, олар бізге басқа кестелерде кем дегенде бір сыртқы кілтпен сілтеме берілген қатарды өшіруге рұқсат етпейді.

Ұзаққа созылу қабілеті бұзылуы

А-дан В-ға 10 бірлікті аударатын мәмілені қарастырайық. Біріншіден, ол А-дан 10 бірлікті алып тастайды, содан кейін В-ға 10 бірлікті қосады. Осы сәтте пайдаланушыға транзакция сәтті аяқталды деп хабар беріледі. Алайда, өзгерістер әлі де диск буферінде кезекте тұрып, дискке жазылуын күтуде. Электр қуаты үзіліп, өзгерістер жоғалып кетеді, бірақ пайдаланушы өзгерістердің сақталғанын (әрине) ойлайды.

Іске асыру

Транзакцияны өңдеу көбінесе түрлі себептерге байланысты қателікке ұшырауы мүмкін операциялар тізбегін қажет етеді. Мысалы, жүйеде дискіде орын қалмауы немесе берілген CPU уақыты таусылған болуы мүмкін. Осы мәселені шешу үшін екі танымал әдіс бар: алдын ала жазу (write ahead logging) және көлеңкелік беттеу (shadow paging). Екі жағдайда да жаңартылатын барлық ақпаратқа құлып қою қажет, ал оқшаулану деңгейіне байланысты, оқылмалы барлық деректерге де құлып қою қажет болуы мүмкін. Алдын ала жазу әдісінде, деректер қорын өзгертпес бұрын болашақ өзгеріс тұрақты журналға жазылып, деректердің сақталуы қамтамасыз етіледі. Бұл деректер қорының құлау жағдайында тұрақты күйіне оралуына мүмкіндік береді. Көлеңкелік беттеуде жаңартулар деректер қорының толық емес көшірмесіне қолданылады, ал транзакция аяқталғанда жаңа көшірме белсендіріледі.

Қалпына келтіру мен бірнеше нұсқаны жасау

Көптеген деректер қоры ACID мүмкіндіктерін қамтамасыз ету үшін құлыптауға сүйенеді. Құлыптау дегеніміз, транзакция қол жеткізетін деректерді белгілейді, соның арқасында ДБЖС (Деректерді басқару жүйесі) бірінші транзакция сәтті аяқталғанға дейін немесе сәтсіздікке ұшырағанға дейін басқа транзакцияларға оларды өзгертуге рұқсат бермейтінін біледі. Құлыпты деректерді өңдеу алдында міндетті түрде алу керек, оның ішінде тек оқылатын, бірақ өзгертілмейтін деректерді де. Тривиальды емес транзакциялар көбінесе көптеген құлыптарды қажет етеді, бұл айтарлықтай қосымша шығындарға және басқа транзакцияларды тоқтатуға әкеледі. Мысалы, егер A пайдаланушысы B пайдаланушы өзгертуге тырысатын деректердің қатарын оқуға тиіс транзакцияны іске қосса, B пайдаланушысы A пайдаланушысының транзакциясы аяқталғанша күтуі керек. Толық оқшаулануды қамтамасыз ету үшін екі кезеңді құлыптау жиі қолданылады. Құлыптауға балама – көп нұсқалы бір мезгілде басқару, онда деректер қоры әрбір оқу транзакциясына басқа белсенді транзакциямен өзгертілген деректердің бұрынғы, өзгертілмеген нұсқасын ұсынады. Бұл оқырмандарға құлыптарды пайдаланбастан жұмыс істеуге мүмкіндік береді, яғни жазу транзакциялары оқу транзакцияларын тоқтатпайды, ал оқырмандар жазушыларды тоқтатпайды. Мысалға қайта оралайық, егер A пайдаланушысының транзакциясы B пайдаланушы өзгертетін деректерді сұраса, деректер қоры A пайдаланушысына B пайдаланушы транзакцияны бастаған кезде болған деректердің нұсқасын ұсынады. A пайдаланушысы деректер қорының тұрақты көрінісін алады, тіпті басқа пайдаланушылар деректерді өзгертіп жатқанда да. Бір іске асыру, атап айтқанда, деректерді көшіру (snapshot isolation), оқшаулану қасиетін жеңілдетеді.

Бөлінген операциялар

Асылы таратылған деректер базасындағы таратылған транзакцияда ACID қасиеттерін қамтамасыз ету, егер транзакцияға әсер ететін барлық деректерге бір ғана түйін жауапты болмаса, қосымша қиындықтар тудырады. Желілік байланыстар үзілуі мүмкін, немесе бір түйін транзакцияның өзінің бөлігін сәтті орындап бітіргеннен кейін, басқа түйіндегі қателік салдарынан өзгерістерін кері қайтаруға мәжбүр болуы мүмкін. Екі кезеңді келісім протоколы (екі кезеңді құлыптаумен шатастырмаңыз) таратылған транзакциялар үшін атомдық тұрақтылықты қамтамасыз етеді, транзакцияға қатысушылардың әрқайсысы транзакцияны қабылдау немесе қабылдамау туралы келісуін қамтамасыз ету үшін. Қысқасы, бірінші кезеңде бір түйін (координатор) басқа түйіндерден (қатысушылардан) сауал алады, және барлығы дайын екенін растағаннан кейін ғана координатор екінші кезеңде транзакцияны ресмилендіреді.