Практическое использование уровня изоляции Seralization? - PullRequest
5 голосов
/ 20 апреля 2011

При каких сценариях мы используем SERIALIZABLE уровень изоляции? Я видел некоторые ответы на веб-сайте, где говорится, что если вы хотите, чтобы транзакция была полностью изолирована, мы обычно делаем это.

Что я хотел бы узнать из вашего собственного опыта, так это то, что когда вы использовали это в своих проектах / или вы видели, что это будет использоваться в других проектах, и каково было конкретное требование, которое не выполнялось другие уровни изоляции?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2011

SERIALIZABLE полезно, когда вы создаете сложные отчеты, требующие нескольких запросов.

В READ COMMITTED или REPEATABLE READ запросы могут видеть изменения, сделанные между началом транзакции и моментом ее запуска.

pg_dump, утилита PostgreSQL dump, запускает свою работу с выдачи SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, чтобы гарантировать, что состояние выгружаемой базы данных будет соответствовать моменту запуска утилиты и последующим изменениямбаза данных не может помешать созданию дампа.

3 голосов
/ 04 апреля 2012

SERIALIZABLE транзакции полезны, если вы хотите простое доказательство правильности в параллельных нагрузках.Поскольку определение уровня изоляции сериализуемой транзакции в стандарте SQL (начиная с SQL-92) заключается в том, что поведение любого параллельного набора сериализуемых транзакций должно соответствовать некоторому последовательному (по одному) порядку выполнения, любойТранзакция, которая может показывать, что она работает правильно, когда она запускается сама по себе, будет действовать правильно как часть любого набора сериализуемых транзакций.

Эта защита требует затрат -- транзакции должны время от времени блокироваться или откатываться для повторной попытки, чтобы обеспечить сериализуемую изоляцию транзакций, и информация должна отслеживаться, чтобы определить, когда необходимо предпринять такие действия.В некоторых средах разработки с небольшим количеством типов транзакций и небольшим числом разработчиков зачастую более выгодно использовать менее строгий уровень изоляции и явно управлять условиями гонки в коде приложения.Когда десятки программистов работают над схемой с сотнями таблиц и десятками тысяч типов транзакций, затраты на определение условий гонки могут стать чрезмерными при менее строгих уровнях изоляции, и, как правило, становится более рентабельным использование сериализуемых транзакций..

В настоящее время наиболее часто реализуемым методом обеспечения сериализуемых транзакций является строгая двухфазная блокировка (S2PL), которая основывается на блокировке блокировок, удерживаемых до конца каждой транзакции, и обнаружении взаимоблокировок с откатами для их устранения.В нагрузках с очень небольшим количеством конфликтов записи может использоваться оптимистический контроль параллелизма (OCC).Он отслеживает «набор чтения» в ходе транзакции и откатывается, если любая другая транзакция изменяет набор чтения.Некоторые продукты баз данных называют изоляцию моментальных снимков сериализуемой, хотя на самом деле она не обеспечивает гарантий, требуемых стандартом SQL.Новый метод, называемый Serializable Snapshot Isolation (SerializableSI или SSI), был впервые описан в академической статье, представленной на ACM SIGMOD 2008 года, и используется в PostgreSQL версии 9.1 и более поздних.Он использует изоляцию моментальных снимков плюс отслеживание шаблонов зависимостей чтения-записи, чтобы определить, когда транзакция должна быть отменена.Есть другие методы, которые встречаются реже в производстве.Каждый из них имеет свой набор преимуществ и недостатков, предоставляя различные точки безубыточности для такого вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...