Кіріспе

Бірнеше ерекше өзгерістерді бір операция ретінде қолданатын операция. Компьютер ғылымы саласында атомдық фиксация – бір операция ретінде бірнеше ерекше өзгерісті қолданатын операция. Егер өзгерістер қолданылса, онда атомдық фиксация сәтті деп есептеледі. Егер атомдық фиксация аяқталмас бұрын қате пайда болса, онда атомдық фиксациямен жасалған барлық өзгерістер кері қайтарылады. Бұл жүйенің әрқашан тұрақты күйде болатынын қамтамасыз етеді. Оқшауланудың тағы бір маңызды қасиеті – олардың атомдық операциялар ретіндегі табиғатынан туындайды. Оқшаулану бір уақытта тек бір атомдық фиксацияның өңделуін қамтамасыз етеді. Атомдық фиксация ең көп қолданылатындары – деректер базасы жүйелері мен нұсқаларды басқару жүйелері. Атомдық фиксацияның қиындығы – олар бірнеше жүйе арасында координацияны талап етеді. Компьютерлік желілердің сенімді еместігін ескеретіңіз, ешқандай алгоритм барлық жүйелермен координациялай алмайды, бұл «Екі генералдың мәселесінде» дәлелденген. Деректер базалары кеңінен тараған сайын, бұл координация нақты атомдық фиксация жасау қиындығын арттырады.

Қолданылуы

Атомдық коммиттер деректерді көп қадамды жаңарту үшін өте қажет. Бұл екі есепшот арасындағы ақша аударудың қарапайым мысалында анық көрінеді. Мысал X есепшотынан Y есепшотына 100 доллар аудару операциясы кезінде Y есепшотының қалдығын тексерумен күрделенеді. Алдымен, X есепшотынан 100 доллар алынады. Екіншіден, Y есепшотына 100 доллар қосылады. Егер бүкіл операция бір атомдық коммит ретінде аяқталмаса, бірнеше мәселе туындауы мүмкін. Егер жүйе операцияның ортасында, X-тен ақша алынғаннан кейін, Y-ге қосылмас бұрын істен шықса, онда 100 доллар жоғалып кетеді. Тағы бір мәселе, егер 100 доллар қосылғанға дейін Y-дің қалдығы тексерілсе, Y-дің дұрыс емес қалдығы көрсетіледі. Атомдық коммиттер болғанда мұндай жағдайлардың ешқайсысы да орын алмайды. Бірінші жағдайда, жүйе істен шықса, атомдық коммит кері қайтарылып, ақша X есепшотына қайтарылады. Екінші жағдайда, Y есепшотының қалдығын сұрау атомдық коммит толық аяқталғанға дейін мүмкін емес.

Деректер базасы жүйелері

Деректер базасы жүйелеріндегі атомдық міндеттемелер ACID қасиеттерінің екі маңыздысы – атомдылық пен сәйкестікті қамтамасыз етеді. Сәйкестік тек қана атомдық міндеттемедегі әр өзгеріс сәйкес болған жағдайда ғана қол жеткізіледі. Мысал көрсеткендей, атомдық міндеттемелер деректер базасындағы көп қадамды операциялар үшін маңызды. Деректер базасы орналасқан физикалық дискінің қазіргі заманғы аппараттық құрылымына байланысты нағыз атомдық міндеттемелер болуы мүмкін емес. Дискіге жазылатын ең кішкентай бөлік – сектор деп аталады. Бір деректер жазбасы бірнеше секторды қамтуы мүмкін. Бір уақытта тек бір секторды жазуға болады. Осы жазу шегінің салдарынан нағыз атомдық міндеттемелерге қол жеткізу мүмкін емес. Деректер базасы жадындағы жазбалар өзгертілгеннен кейін дискіге жазылуы үшін тізімге қойылады. Бұл мысалда көрсетілген мәселелер қайта орын алуы мүмкін екенін білдіреді. Бұл мәселені шешуге бағытталған кез келген алгоритмдік әлдебір екі генералдың мәселесіне тап болады. Екі кезеңді және үш кезеңді протоколдар осы және атомдық міндеттемелермен байланысты басқа да мәселелерді шешуге тырысады. Екі кезеңді протокол координатордан, егер бірдеңе дұрыс болмаса, деректер базасының бастапқы күйін қалпына келтіру үшін қажетті барлық ақпаратты сақтауды талап етеді. Атауынан көрініп тұрғандай, екі кезең бар: дауыс беру және міндеттеме. Дауыс беру кезеңінде әрбір түйін атомдық міндеттемедегі өзгерістерді өзінің дискісіне жазады. Содан кейін түйіндер өздерінің күйі туралы координаторға хабарлайды. Егер кез келген түйін координаторға хабарласпаса немесе олардың күйі туралы хабарлама жоғалса, координатор түйіннің жазуы сәтсіздікке ұшырады деп есептейді. Барлық түйіндер координаторға хабарлағаннан кейін екінші кезең басталады. Міндеттеме кезеңінде координатор әрбір түйінге олардың жеке журналдарына жазу үшін міндеттеме хабарламасын жібереді. Бұл хабарлама түйіннің журналына қосылмайынша, жасалған өзгерістер толық емес деп есептеледі. Егер түйіндердің бірі сәтсіздік туралы хабарласа, координатор кері хабарлама жібереді. Бұл түйіндер дискіге жазған өзгерістерді жояды. Үш кезеңді міндеттеме протоколы екі кезеңді міндеттеме протоколындағы негізгі мәселені шешуге тырысады, егер координатор және басқа түйін міндеттеме кезеңінде бір уақытта сәтсіздікке ұшыраса, қандай әрекет жасалуы керек екенін анықтай алмайды. Бұл мәселені шешу үшін протоколға үшінші кезең қосылады. Міндеттемеге дайындалу кезеңі дауыс беру кезеңінен кейін және міндеттеме кезеңінен бұрын жүзеге асырылады. Дауыс беру кезеңінде, екі кезеңді міндеттемеге ұқсас, координатор әрбір түйіннің міндеттемеге дайын болуын сұрайды. Егер кез келген түйін сәтсіздікке ұшыраса, координатор сәтсіз түйін күтіп тұрып, белгілі бір уақыт өткізеді. Егер мұндай жағдай орын алса, координатор әрбір түйінге тоқтату хабарламасын жібереді. Егер түйіндердің кез келгені сәтсіздік туралы хабарлама жіберсе, дәл осы әрекет орындалады. Дауыс беру кезеңіндегі әрбір түйінден сәттілік туралы хабарлама алғаннан кейін, дайындалу кезеңі басталады. Бұл кезеңде координатор әрбір түйінге дайындалу хабарламасын жібереді. Әрбір түйін дайындалу хабарламасын растауы және жауап беруі керек. Егер жауап келмесе немесе кез келген түйін дайын емес деп хабарласа, координатор тоқтату хабарламасын жібереді. Уақыт біткенше дайындалу хабарламасын алмаған кез келген түйін міндеттемені тоқтатады. Барлық түйіндер дайындалу хабарламасына жауап бергеннен кейін, міндеттеме кезеңі басталады. Бұл кезеңде координатор әрбір түйінге міндеттеме хабарламасын жібереді. Әрбір түйін бұл хабарламаны алған кезде нақты міндеттемені орындайды. Егер хабарлама жоғалғандықтан немесе координатор сәтсіздікке ұшырағандықтан міндеттеме хабарламасы түйінге жетпесе, ол белгілі бір уақыт өткен соң міндеттемені орындайды. Егер координатор қалпына келтірілсе, ол әрбір түйінге міндеттеме хабарламасын жібереді.

Тексеруді бақылау

Атомдық коммиттер нұсқаны басқару бағдарламалық жасақтамасының кең таралған мүмкіндігі және репозиторийде тұрақты күйді сақтау үшін өте маңызды. Көптеген нұсқаны басқару бағдарламалары сәтсіз коммиттің бір бөлігін де қолданбайды. Ерекше жағдайларға CVS, VSS және IBM Rational ClearCase (UCM режимінде) жатады. Мысалы, нұсқаны басқару бағдарламалық жасақтамасы автоматты түрде шешілмейтін біріктіру қақтығысын кездестірсе, онда өзгерістер жиынтығының ешбір бөлігі біріктірілмейді. Оның орнына, әзірлеуші өзгерістерін кері қайтаруға немесе қақтығысты қолмен шешуге мүмкіндік алады. Бұл жобаның ішінара қолданылған өзгерістер жиынтығынан туындаған бұзылған күйге түсуіне жол бермейді, яғни коммиттен бір файл сәтті өтеді, ал оған тәуелді өзгерістері бар басқа файл сәтсіз аяқталады. Атомдық коммиттер сондай-ақ монорепо деп аталатын нұсқаны басқару бағдарламалық жасақтамасын дамыту стратегиясын қолдана отырып, бір операцияда бірнеше жобаға бір мезгілде өзгерістер енгізу мүмкіндігін де білдіре алады. Жақсы түсінудің себебі – коммиттердің кішкентай көлемі мен нақтылығы. Тек бір түрдегі өзгерісті іздегенде, не өзгергенін және оның себебін түсіну оңайырақ. Бұл көзді кодқа форматтау өзгерістерін енгізген кезде ерекше маңызды. Форматтау және функционалдық өзгерістер біріктірілсе, пайдалы өзгерістерді анықтау қиынға соғады. Егер файлдағы табуляциялардың орнына үш пробел қолданылса, файлдағы барлық табуляциялар өзгергендей көрінеді. Бұл функционалдық өзгерістер де енгізілген жағдайда маңызды, өйткені рецензент функционалдық өзгерістерді байқамай қалуы мүмкін. Егер тек атомдық коммиттер жасалса, қателерді енгізетін коммиттерді анықтау әлдеқайда оңай болады. Қатеге қандай коммит себеп болғанын анықтау үшін барлық коммиттерді қарап шығудың қажеті жоқ, тек осы функционалдылықпен байланысты коммиттерді тексеру жеткілікті. Егер қатені кері қайтару қажет болса, атомдық коммиттер бұл жұмысты да оңайлатады. Кейінгі өзгерістерді интеграциялау алдында қате нұсқаға қайта оралып, өзгерістерді қолмен алып тастаудың орнына, әзірлеуші анықталған коммиттегі өзгерістерді кері қайтара алады. Бұл сонымен қатар бір коммитте кездейсоқ түрде байланысты емес өзгерістерді алып тастау қаупін азайтады. Атомдық коммиттер бір уақытта бір ғана қате түзетілгенде, қателерді тез арада тексеруге мүмкіндік береді. Тек түзетіліп жатқан қатеге тікелей әсер ететін файлдар мен өзгерістерді ғана тексеру жеткілікті, өзара байланысты емес бірнеше файлдарды тексерудің қажеті жоқ. Бұл қателерді түзетулерді сынау үшін оңай жинауға да мүмкіндік береді, өйткені коммитте тек қателерді түзетуге қатысты өзгерістер болады.