Кіріспе
Деректер қорында және транзакцияларды өңдеуде (транзакцияларды басқару) көшпелі оқшаулау – транзакциядағы барлық оқулар деректер қорының тұрақты көшпелі көрінісін көреді (практикада ол басталган кездегі соңғы тіркелген мәндерді оқиды), ал транзакция өзі жасаған жаңартулар сол көшпелі көріністен кейін жасалған бір мезгілдегі жаңартулармен қақтығыспаса ғана сәтті аяқталады. Көптеген ірі деректерді басқару жүйелері көшпелі оқшаулауды қабылдады, мысалы InterBase, Firebird, Oracle, MySQL, PostgreSQL, SQL Anywhere, MongoDB және Microsoft SQL Server (2005 ж. және одан кейінгі нұсқалары). Оны қабылдаудың басты себебі – ол серияландыруға қарағанда жақсы өнімділікке мүмкіндік береді, бірақ серияландырудың алдын алатын (бірақ барлығы емес) бір мезгілдестік аномалияларының көпшілігін болдырмайды. Іс жүзінде көшпелі оқшаулау көп нұсқалы бір мезгілдестік басқару (MVCC) шеңберінде жүзеге асырылады, онда әр дерек элементінің (нұсқалардың) буындық мәндері сақталады: MVCC – бұл объект жазылған сайын деректер базасы объектісінің жаңа нұсқасын жасап, әр объектінің соңғы бірнеше маңызды нұсқаларын (әр объектінің) транзакциялардың оқу операцияларын жүргізуге мүмкіндік беру арқылы бір мезгілдестікті және өнімділікті арттырудың кең таралған тәсілі. Көшпелі оқшаулау ANSI SQL 92 стандартының оқшаулау деңгейлерін анықтауын сынау үшін қолданылды, себебі ол SQL стандарты тыйым салған "аномалиялардың" ешқайсысын көрсетпейді, бірақ серияландырылмайды (ANSI анықтаған аномалиясыз оқшаулау деңгейі). Серияландырудан ерекшеленуіне қарамастан, көшпелі оқшаулауды кейде Oracle серияландырылған деп атайды.
Анықтама
Тездету изоляциясы бойынша орындалатын транзакция, транзакция басталған кезде алынған деректер қорының жеке түйіндемесі бойынша жұмыс істейді. Транзакция аяқталғанда, ол сәтті расталады, егер транзакция жаңартқан мәндер түйіндеме алынғаннан кейін сырттан өзгертілмеген болса ғана. Мұндай жазу-жазу қақтығысы транзакцияның үзілуіне себеп болады. Жазу қисылуында екі транзакция (T1 және T2) бір мезгілде бір-біріне қатысты деректер жиынтығын оқиды (мысалы, V1 және V2 мәндері), бір мезгілде бөлек жаңартулар жасайды (мысалы, T1 V1-ді жаңартады, T2 V2-ні жаңартады) және соңында бір мезгілде растайды, ешқайсысы екіншісі жасаған жаңартуды көрмейді. Егер жүйе тізбектеле жатса, мұндай аномалия мүмкін емес болар еді, өйткені T1 немесе T2 «бірінші» болып, екіншісіне көрінетін болуы керек. Керісінше, түйіндеме изоляциясы жазу қисылу аномалияларын рұқсат етеді. Нақты мысал ретінде, V1 және V2 екі баланс бір адамның, Филдің иелігінде деп елестетіңіз. Банк V1 немесе V2 дефицитке түсуіне рұқсат береді, егер екеуінің жиынтығы ешқашан теріс болмаса (яғни V1 + V2 ≥ 0). Қазіргі уақытта екі баланстың да құны 100 доллар. Фил бір мезгілде екі транзакцияны бастайды: T1 V1-ден 200 доллар шығарады, ал T2 V2-ден 200 доллар шығарады. Егер деректер қоры тізбектеле жатқан транзакцияларға кепілдік берсе, T1-ді кодтаудың ең қарапайым жолы V1-ден 200 доллар шегеру, содан кейін V1 + V2 ≥ 0 әлі де орындалатынын тексеру және орындалмаса, тоқтату. T2 да V2-ден 200 доллар шегереді және содан кейін V1 + V2 ≥ 0 екенін тексереді. Транзакциялар тізбектеле орындалуы керек болғандықтан, T1 бірінші болып орындалады, V1 = -100 доллар, V2 = 100 доллар қалдырады және T2-нің сәтті орындалуына жол бермейді (өйткені V1 + (V2 - 200 доллар) енді -200 долларға тең), немесе T2 бірінші болып орындалады және T1-дің расталуына ұқсас түрде кедері келтіреді. Егер деректер қоры түйіндеме изоляциясы (MVCC) бойынша жұмыс істесе, T1 және T2 деректер қорының жеке түйіндемелері бойынша жұмыс істейді: әрқайсысы есепшоттан 200 доллар шегереді, содан кейін түйіндеме жасалған кездегі екінші есепшоттың мәнін пайдаланып, жаңа жиынтықтың нөлге тең екенін тексереді. Жаңартулар қақтығыспағандықтан, екеуі де сәтті орындалады, V1 = V2 = -100 доллар және V1 + V2 = -200 доллар қалдырады. Көп нұсқалы бір мезгілде басқаруды (MVCC) пайдаланатын кейбір жүйелер транзакциялардың бір мезгілде орындалуына мүмкіндік беру үшін (ғана) түйіндеме изоляциясын қолдауы мүмкін, сондай-ақ транзакция аяқталғанда барлық оқу операцияларын қайта тексеру қажеттілігін жою үшін. Бұл ыңғайлы, өйткені MVCC жақындағы тарихтың тұрақты күйлерін сақтайды. Транзакция кезінде сақталуы тиіс жалғыз ақпарат – жасалған жаңартулар тізімі, оны растаудан бұрын қақтығыстарды анықтау оңай. Алайда, MVCC жүйелері (мысалы, MarkLogic) өнімділіктің кейбір артықшылықтарын алу және оқшауланудың «тізбектелу» деңгейін сақтау үшін жазуларды тізбектеу үшін құлыптарды MVCC-мен бірге пайдаланады.
Айналадағы амалдар
Жазу ауытқуларынан туындайтын ықтимал үйлесімсіздік проблемаларын транзакцияларға (әйтпесе қажет емес) жаңартулар қосу арқылы, серияландыру қасиетін сақтау үшін шешуге болады. Конфликтті нақтылау Арнайы конфликт кестесін қосыңыз, оны екі транзакция да тікелей жазу-жазу конфликтін тудыру үшін жаңартады. Көтеру Бір транзакция жазуға арналған оқу орнын "жаңартады" (бірдей мәнмен алмастырады), тікелей жазу-жазу конфликтін жасау үшін (немесе эквивалентті көтеруді пайдаланыңыз, мысалы Oracle's SELECT FOR UPDATE). Жоғарыдағы мысалда, жасырын шектеуді нақтылайтын жаңа кесте қосу арқылы конфликтті нақтылауға болады, осы арқылы әр адамды олардың жалпы балансына сәйкестендіруге болады. Фил 200 доллармен бастайды, және әр транзакция осы баланстан 200 доллар шегеруге тырысады, бұл екеуінің бір уақытта сәтті орындалуына кедергі келтіретін жазу-жазу конфликтін тудырады. Дегенмен, бұл тәсіл нормативтік нысанды бұзады. Балама ретінде, транзакцияның біреуінің оқуын жазуға көтеруге болады. Мысалы, T2 V1 = V1 деп орнату арқылы T1-мен жасанды жазу-жазу конфликтін тудырады, және тағы да екеуінің бір мезгілде орындалуына жол бермейді. Бұл әрқашан мүмкін болмайды. Сондықтан, жалпы алғанда, суреттік оқшаулану пайдаланушыға тривиалды емес шектеулерді сақтау мәселесін жүктейді, ол ықтимал қиындықтарды немесе мүмкін шешімдерді түсінбеуі мүмкін. Бұл ауысудың артықшылығы – жақсартылған өнімділік.
Терминология
Snapshot оқшаулау Oracle және PostgreSQL нұсқаларының 9.1-ге дейінгілерінде "серияландыру" режимі деп аталады, бұл "шынайы серияландыру" режимімен шатасуға себеп болуы мүмкін. Бұл шешімге қатысты пікірлер әртүрлі; ақиқатында пайдаланушылар өз деректер базасы жүйесі логикасындағы күтілмеген аномалиялық әрекеттерді болдырмау үшін осы екеуінің арасындағы айырмашылықты білуі керек.
Тарих
Снапшотты оқшаулау көп нұсқалы бір мезгілде басқару деректер базаларындағы жұмыстардың нәтижесінде пайда болды, онда деректер базасының бірнеше нұсқалары бір уақытта сақталады, бұл оқырмандарға жазушылармен қақтығыспай жұмыс істеуге мүмкіндік береді. Мұндай жүйе осы оқшаулау деңгейін табиғи түрде анықтауға және іске асыруға қолайлы жағдай жасайды. Алайда, ANSI SQL 92 стандарты құлыптауға негізделген деректер базасын ескере отырып жасалған, сондықтан MVCC жүйелеріне қолданғанда оның мағынасы шамалы. Беренсон және авторлар 1995 жылы мақала жариялады. Бұл серіктемелілікті іске асыру көп нұсқалы бір мезгілде басқару деректер базаларына өте ыңғайлы және PostgreSQL 9.1-де қабылданды, онда ол Серіктемелі Снапшотты Оқшаулау (SSI) деп аталады. Тұрақты қолданған жағдайда, бұл жоғарыда аталған шешімдердің қажеттілігін жояды. Снапшотты оқшаулаумен салыстырғандағы кемшілігі – тоқтатылған транзакциялардың санының артуы. Жұмыс жүктемесіне байланысты, бұл жоғарыда аталған шешімдермен салыстырғанда, снапшотты оқшаулаудан жақсы немесе нашар жұмыс істей алады.
where it is known as Serializable Snapshot Isolation (SSI). When used consistently, this eliminates the need for the above workarounds. The downside over snapshot isolation is an increase in aborted transactions. This can perform better or worse than snapshot isolation with the above workarounds, depending on workload.