sql - Кое е най-доброто ниво на изолация на транзакции по подразбиране за ERP, ако има такова?
This question and all comments follow the
"Attribution Required."
Подобни проблеми
- Какво е нивото на изолиране на транзакциите по подразбиране за SQL Server с ADO.NET?
- sql - NOLOCK спрямо ниво на изолиране на транзакциите
- Задаване на ниво на изолация на транзакциите на MySQL
- sql server - Обхват на ниво на изолация на транзакцията
- sql server 2008 - TransactionScope и ниво на изолация
- Още подобни въпроси >>
Всички отговори
99 пъти от 100, прочетеното ангажирано е правилният отговор. Това гарантира, че виждате само промени, извършени от другата сесия (и по този начин резултати, които са последователни, ако приемем, че сте проектирали правилно транзакциите си). Но това не налага режийните разходи за заключване (особено в бази данни, различни от Oracle), които налагат повторяемо четене или сериализуемо.
Много понякога може да искате да стартирате отчет, в който сте готови да жертвате точността на скоростта и да зададете нивото на изолирана прочит. Това рядко е добра идея, но понякога е разумно приемливо решение, за да се заключат проблемите със спора.
Сериализуемо и повторяемо четене се използват понякога, когато имате процес, който трябва да вижда последователен набор от данни за цялото изпълнение, независимо от това, какви други транзакции правят в момента. Може да е уместно да зададете процес на съгласуване в края на месеца на сериализуем, например, ако има много процедурен код, възможност потребителите да правят промени, докато процесът се изпълнява, и изискване, което процесът трябва да уверете се, че винаги вижда данните такива, каквито са съществували към момента на съгласуване.
Не забравяйте за SNAPSHOT, който е точно под СЕРИАЛИЗИРАНО.
Зависи колко е важно данните да бъдат точни в отчетите. Това наистина е нещо по задача.
Наистина зависи много от това как проектирате приложението си, лесният отговор просто се изпълнява на READ_COMMITTED.
Можете да направите аргумент, че ако проектирате системата си с оглед на това, че можете да използвате READ_UNCOMMITTED по подразбиране и да увеличите нивото на изолация само когато имате нужда от него. По-голямата част от транзакциите ви така или иначе ще успеят, така че четенето на неангажирани данни няма да е голяма работа.
Начинът, по който нивата на изолация влияят на вашите заявки, зависи от вашата целева база данни. Например бази данни като Sybase и MSSQL трябва да заключват повече ресурси, когато стартирате READ_COMMITTED, отколкото бази данни като Oracle.
За SQL Server (и може би най-голямата RDBMS) щях да се придържам по подразбиране. За SQL Server това е READ COMMITTED. Нещо повече и започвате да претоварвате DB, нищо по-малко и имате проблеми с последователността.
Прочетете Неангажирано определено е аутсайдът в повечето форуми. Съществуват обаче причини да се използва, които надхвърлят въпрос „скорост срещу точност“, който често се изтъква.
Да приемем, че имате:
При ангажиране за четене, транзакциите по-горе няма да се освободят, докато не бъдат ангажирани. Тогава можете да изпаднете в ситуация, в която T1 чака T2 да освободи A, а T2 чака T1 да освободи B. Тук двете транзакции се сблъскват в ключалка.
Можете да пренапишете тези процедури, за да избегнете този сценарий (пример: придобивайте ресурси винаги по азбучен ред!). И все пак, при твърде много едновременни потребители и десетки хиляди редове код, този проблем може да стане едновременно много вероятен и много труден за диагностициране и разрешаване.
Алтернативата е използването на Прочетено неангажирано. След това проектирате транзакциите си, приемайки, че може да има мръсни четения. Аз лично намирам този проблем за много по-локализиран и лечим от блокиращите останки от влакове.
Проблемите от мръсните четения могат да бъдат извадени от
(1) Отмяна: не. Това трябва да е последната защитна линия само в случай на хардуерен отказ, отказ на мрежата или срив на програмата.
(2) Използвайте ключалки на приложения, за да създадете заключващ механизъм, който работи на по-високо ниво на абстракция, където всяка ключалка е по-близо до реалния ресурс или действие.
Leave a Reply