Post #88
1.84K

Дневник капитана, дата '20250513'
🔷 Изолента для транзакций 🔷
Перейдем букве 🔤 нашего ACID. Она говорит об изолированности (изоляции) транзакций. Т.е. никак две параллельно идущие транзакции не должны мешать друг другу. Ведь в таком случае могут быть те или иные проблемы, аномалии. Выделяют следующий список аномалий чтения данных (по порядку, начиная с самых «страшных»):
💩 Грязное чтение (dirty read). Когда одна транзакция читает изменения другой незавершенной транзакции. В итоге вторая транзакция может не завершится, и то, что прочитала первая, будет «неправдой».
🎲 Неповторяющееся чтение (non-repeatable read). Случай, когда открытая транзакция прочитает записи один раз, потом до закрытия другой раз, и эти данные будут не совпадать, т.к. их изменила другая (уже завершенная) транзакция.
👻 Фантомное чтение (phantom reads). Похоже на неповторяющееся чтение, но здесь ситуация, когда сами строки по полям остаются теми же, но целые строки добавляются и исчезают. И внутри транзакции по тем же условиям выберется другое количество строк.
В итоге, как я писал, оказалось, что бороться со всеми аномалиями дело довольно дорогое. Поэтому выделили несколько уровней изоляции, которые решают те или иные проблемы. Дальше можете проверить себя. Я буду перечислять эти уровни, а вы постарайтесь понять, какой уровень используется в вашей системе.
1️⃣ Read uncommitted (чтение незафиксированных данных). Это самый низкий уровень, все аномалии в нем могут быть.
2️⃣ Read committed (чтение фиксированных данных). Нет грязного, но есть неповторяющееся и фантомное чтения.
3️⃣ Repeatable read (повторяющееся чтение). Допустима только аномалия фантомного чтения.
4️⃣ Serializable (упорядочиваемость). Нет никаких перечисленных выше аномалий.
В идеальной картине ACID используется уровень Serializable, все чинно, благородно. Но очень медленно. Транзакциям приходится выстраиваться в очередь, чтобы поработать с той же таблицей.
На деле же чаще всего в популярных СУБД (и 1С также) используется уровень Read committed. Скорее всего, и у вас тоже. Т.е. вы не встретите грязное чтение, остальное для вас в порядке вещей.
Следует еще сказать о различных реализациях уровня Read committed, которые не будут давать оператору в транзакции читать незафиксированные данные. Первый способ – это наложение блокировок на читаемые оператором данные. Так работает MS SQL Server. Второй – это использование версионирования. Оператор читает последнюю зафиксированную версию (снимок) данных. Такой метод используется в PostgreSQL. В MS SQL Server тоже есть такой вариант, и он выделен в отдельный уровень - Read Committed Snapshot.
Но а если вы все же захотели поднять уровень изоляции, можно ли это сделать в 1С? И да, и нет. Вообще, борьба с аномалиями и изолированность обеспечивается за счет блокировок. Поэтому в 1С уровни изоляции зависят от режимов управления блокировками в транзакции.
По умолчанию сейчас и для самой конфигурации, и для всех таблиц выставляется режим
Второй вариант режима, который можно выставить — это
В стандартном же режиме управляемых блокировок 1С уже не «надеется» на СУБД, а накладывает свои объектные блокировки, которые привязаны к прикладным объектам. В этом же режиме и разработчик может наложить необходимые кастомные блокировки. Но это уже совсем другая история.
🔷 Изолента для транзакций 🔷
Перейдем букве 🔤 нашего ACID. Она говорит об изолированности (изоляции) транзакций. Т.е. никак две параллельно идущие транзакции не должны мешать друг другу. Ведь в таком случае могут быть те или иные проблемы, аномалии. Выделяют следующий список аномалий чтения данных (по порядку, начиная с самых «страшных»):
💩 Грязное чтение (dirty read). Когда одна транзакция читает изменения другой незавершенной транзакции. В итоге вторая транзакция может не завершится, и то, что прочитала первая, будет «неправдой».
🎲 Неповторяющееся чтение (non-repeatable read). Случай, когда открытая транзакция прочитает записи один раз, потом до закрытия другой раз, и эти данные будут не совпадать, т.к. их изменила другая (уже завершенная) транзакция.
👻 Фантомное чтение (phantom reads). Похоже на неповторяющееся чтение, но здесь ситуация, когда сами строки по полям остаются теми же, но целые строки добавляются и исчезают. И внутри транзакции по тем же условиям выберется другое количество строк.
В итоге, как я писал, оказалось, что бороться со всеми аномалиями дело довольно дорогое. Поэтому выделили несколько уровней изоляции, которые решают те или иные проблемы. Дальше можете проверить себя. Я буду перечислять эти уровни, а вы постарайтесь понять, какой уровень используется в вашей системе.
1️⃣ Read uncommitted (чтение незафиксированных данных). Это самый низкий уровень, все аномалии в нем могут быть.
2️⃣ Read committed (чтение фиксированных данных). Нет грязного, но есть неповторяющееся и фантомное чтения.
3️⃣ Repeatable read (повторяющееся чтение). Допустима только аномалия фантомного чтения.
4️⃣ Serializable (упорядочиваемость). Нет никаких перечисленных выше аномалий.
В идеальной картине ACID используется уровень Serializable, все чинно, благородно. Но очень медленно. Транзакциям приходится выстраиваться в очередь, чтобы поработать с той же таблицей.
На деле же чаще всего в популярных СУБД (и 1С также) используется уровень Read committed. Скорее всего, и у вас тоже. Т.е. вы не встретите грязное чтение, остальное для вас в порядке вещей.
Следует еще сказать о различных реализациях уровня Read committed, которые не будут давать оператору в транзакции читать незафиксированные данные. Первый способ – это наложение блокировок на читаемые оператором данные. Так работает MS SQL Server. Второй – это использование версионирования. Оператор читает последнюю зафиксированную версию (снимок) данных. Такой метод используется в PostgreSQL. В MS SQL Server тоже есть такой вариант, и он выделен в отдельный уровень - Read Committed Snapshot.
Но а если вы все же захотели поднять уровень изоляции, можно ли это сделать в 1С? И да, и нет. Вообще, борьба с аномалиями и изолированность обеспечивается за счет блокировок. Поэтому в 1С уровни изоляции зависят от режимов управления блокировками в транзакции.
По умолчанию сейчас и для самой конфигурации, и для всех таблиц выставляется режим
Управляемый. Это говорит о том, что в СУБД остается уровень Read committed, а всеми остальными блокировками мы управляем сами.Второй вариант режима, который можно выставить — это
Автоматический. Тогда в случае СУБД MS SQL Server уровень повышается до Repeatable read или Serializable. А для PostgreSQL, что интересно, так и остается Read committed. Меняется область блокировки, захватываются не отдельные записи, а целые таблицы.В стандартном же режиме управляемых блокировок 1С уже не «надеется» на СУБД, а накладывает свои объектные блокировки, которые привязаны к прикладным объектам. В этом же режиме и разработчик может наложить необходимые кастомные блокировки. Но это уже совсем другая история.
- 👍 5
- 🔥 3
- ❤ 1




