sql - Кое е най-доброто ниво на изолация на транзакции по подразбиране за ERP, ако има такова?

Translate

Кратък фон: Тепърва започваме да мигрираме / пренасочваме ERP система към Java с Hibernate, насочвайки едновременно броя на потребителите от 50-100 потребители, използващи системата. Използваме MS SQL Server като сървър на база данни, което е достатъчно добро за това.

Сега старата система изобщо не използва никакви транзакции и разчита за критични части (напр. Промени в наличностите) на задаване на ръчни заключвания (с помощта на флагове) и освобождаването им. Това е нещо като ръчно управление на транзакции. Но понякога има проблеми с несъответствието на данните. В новата система бихме искали да използваме транзакции, за да премахнем тези проблеми.

Сега въпросът: Какво би било добро / разумнопо подразбиранениво на изолация на транзакции, което да се използва за ERP система, при използване на около 85% OLTP и 15% OLAP? Или винаги трябва да решавам за всяка задача, кое ниво на транзакция да използвам?

И като напомняне четирите нива на изолация на транзакциите: ПРОЧЕТЕТЕ НЕКОММИТИРАНИ, ЧЕТЕНИ АНГУЛИРАНИ, ПОВТОРЯЕМИ ЧЕТЕНИ, СЕРИАЛИЗИРАНИ

This question and all comments follow the "Attribution Required."

Всички отговори

Translate

99 пъти от 100, прочетеното ангажирано е правилният отговор. Това гарантира, че виждате само промени, извършени от другата сесия (и по този начин резултати, които са последователни, ако приемем, че сте проектирали правилно транзакциите си). Но това не налага режийните разходи за заключване (особено в бази данни, различни от Oracle), които налагат повторяемо четене или сериализуемо.

Много понякога може да искате да стартирате отчет, в който сте готови да жертвате точността на скоростта и да зададете нивото на изолирана прочит. Това рядко е добра идея, но понякога е разумно приемливо решение, за да се заключат проблемите със спора.

Сериализуемо и повторяемо четене се използват понякога, когато имате процес, който трябва да вижда последователен набор от данни за цялото изпълнение, независимо от това, какви други транзакции правят в момента. Може да е уместно да зададете процес на съгласуване в края на месеца на сериализуем, например, ако има много процедурен код, възможност потребителите да правят промени, докато процесът се изпълнява, и изискване, което процесът трябва да уверете се, че винаги вижда данните такива, каквито са съществували към момента на съгласуване.

източник
Translate

Не забравяйте за SNAPSHOT, който е точно под СЕРИАЛИЗИРАНО.

Зависи колко е важно данните да бъдат точни в отчетите. Това наистина е нещо по задача.

източник
Translate

Наистина зависи много от това как проектирате приложението си, лесният отговор просто се изпълнява на READ_COMMITTED.

Можете да направите аргумент, че ако проектирате системата си с оглед на това, че можете да използвате READ_UNCOMMITTED по подразбиране и да увеличите нивото на изолация само когато имате нужда от него. По-голямата част от транзакциите ви така или иначе ще успеят, така че четенето на неангажирани данни няма да е голяма работа.

Начинът, по който нивата на изолация влияят на вашите заявки, зависи от вашата целева база данни. Например бази данни като Sybase и MSSQL трябва да заключват повече ресурси, когато стартирате READ_COMMITTED, отколкото бази данни като Oracle.

източник
Translate

За SQL Server (и може би най-голямата RDBMS) щях да се придържам по подразбиране. За SQL Server това е READ COMMITTED. Нещо повече и започвате да претоварвате DB, нищо по-малко и имате проблеми с последователността.

източник
Translate

Прочетете Неангажирано определено е аутсайдът в повечето форуми. Съществуват обаче причини да се използва, които надхвърлят въпрос „скорост срещу точност“, който често се изтъква.

Да приемем, че имате:

  • Транзакция T1: Пише Б, Чете А, (още малко работа), Фиксиране.
  • Транзакция T2: Пише A, Чете B, (още малко работа), Ангажиране.

При ангажиране за четене, транзакциите по-горе няма да се освободят, докато не бъдат ангажирани. Тогава можете да изпаднете в ситуация, в която T1 чака T2 да освободи A, а T2 чака T1 да освободи B. Тук двете транзакции се сблъскват в ключалка.

Можете да пренапишете тези процедури, за да избегнете този сценарий (пример: придобивайте ресурси винаги по азбучен ред!). И все пак, при твърде много едновременни потребители и десетки хиляди редове код, този проблем може да стане едновременно много вероятен и много труден за диагностициране и разрешаване.

Алтернативата е използването на Прочетено неангажирано. След това проектирате транзакциите си, приемайки, че може да има мръсни четения. Аз лично намирам този проблем за много по-локализиран и лечим от блокиращите останки от влакове.

Проблемите от мръсните четения могат да бъдат извадени от

  • (1) Отмяна: не. Това трябва да е последната защитна линия само в случай на хардуерен отказ, отказ на мрежата или срив на програмата.

  • (2) Използвайте ключалки на приложения, за да създадете заключващ механизъм, който работи на по-високо ниво на абстракция, където всяка ключалка е по-близо до реалния ресурс или действие.

източник
Leave a Reply
You must be logged in to post a answer.
За автора