Транзакции

Petro Bazeliuk —  Май 6, 2017 — Оставьте комментарий

Хочу рассмотреть вопросы и подготовку к сертификации. Учить правильные ответы плохой путь, а вот понимать ответы и применять их, вы тем самым становитесь на путь к уровню «1С:Эксперт». По сути это цикл записей с расширенными ответами на несколько вопросов из тестов.

Ради увеличения производительности системы «1С:Предприятие 8» должна допустить параллельное выполнение транзакций. При этом система так же должна обеспечить необходимую степень целостности данных (то есть, ограничить параллельность транзакций при работе с одними ресурсами). Строгость этих ограничений может быть различной, в зависимости от решаемой задачи. В современных СУБД такая возможность реализуется путем применения уровней изоляции транзакций. Определяют следующие уровни изоляции (в порядке ее повышения):

  • Read Uncommitted (неподтвержденное чтение, изоляция незафиксированного чтения) — незавершенное чтение. Низший уровень изоляции, обеспечивает максимальную параллельность выполнения транзакций. Данный уровень защищает изменяемые мной данные от изменений, которые могут внести конкурирующие транзакции. Если другой транзакции необходимо изменить те же самые данные, то она должна ожидать завершения изменения данных моей транзакцией. Однако чтение данных разрешено. Таким образом этот уровень изоляции допускает чтение незавершенных изменений данных. Возможны «грязные», неповторяемые чтения и «фантомы».
  • Read Committed Snapshot (подтвержденное чтение с включенным параметром READ_COMMITTED_SNAPSHOT) — запросы не могут считывать данные, которые были изменены другими транзакциями, но еще не были зафиксированы. В момент начала чтения транзакции будет выделен моментальный снимок базы данных, включающий в себя все изменения завершенных к этому моменту времени транзакций. Транзакция может читать этот снимок, получая чистые данные и при этом никого не блокируя. Обеспечивает запрет «грязного» чтения. Возможны неповторяемые чтения и «фантомы».
  • Read Committed (подтвержденное чтение, изоляция зафиксированного чтения) — обеспечивает запрет «грязного» чтения. Если моя транзакция начала изменять данные, то конкурирующая транзакция не может не только изменить, но даже прочитать их до завершения моих изменений. После того, как мои изменения закончены, конкурирующие транзакции могут читать данные, не дожидаясь окончания моей транзакции в целом. Возможны неповторяемые чтения и «фантомы».
  • Repeatable Read (повторяемое чтение, изоляция повторяющегося чтения) — обеспечивает повторяемость чтения данных. Если моя транзакция начинает читать данные, то другая транзакция не может их изменить до окончания моей транзакции. Обеспечивает запрет на «грязные» и неповторяемые чтения. Возможны «фантомы».
  • Snapshot (изоляция моментального снимка) — указывает на то, что данные, считанные любым запросом транзакции, будут согласованы на уровне транзакции с версией данных, существовавших в ее начале. Транзакция распознает только те изменения, которые были зафиксированы до ее начала. Запросы на чтение, выполняемые текущей транзакцией, не видят изменений данных, произведенных другими транзакциями после запуска текущей транзакции. Обеспечивает запрет на «грязные», неповторяемые чтения и «фантомы».
    «1С:Предприятие 8» не поддерживает данный уровень изоляции. 
  • Serializable (упорядоченный, изоляция упорядочиваемых транзакций, сериализуемый, упорядоченные транзакции, сериализуемые транзакции) последовательное выполнение. Этот уровень изоляции является максимальным и обеспечивает полную изоляцию транзакций друг от друга. Обеспечивает запрет на «грязные», неповторяемые чтения и «фантомы».

В зависимости от используемого уровня изоляции, СУБД накладывает различные типы блокировок на различные объекты базы данных на различное время.

Несогласованности данных бывают:

  • Потерянное обновление (lost update) — если один и тот же блок данных одновременно изменяют две разные транзакции, то будет зафиксировано только одно изменение, второе будет утеряно. (при работе с «1С:Предприятие 8» невозможно, поскольку в системе не бывает записи вне транзакции);
  • «Грязное» чтение (dirty read) — чтение данных, добавленных или измененных транзакцией, может дать не точный результат, потому что транзакция может не подтвердится (откатится);
  • Неповторяющееся чтение (non-repeatable read) — при повторном чтении в рамках одной и той же транзакции оказывается, что ранее прочитанные данные изменены или удалены;
  • Фантомное чтение (phantom reads) с при повторном чтении в рамках одной и той же транзакции оказывается, что прочитаны строки, которых при предыдущих чтениях не было (новые строки называют «фантомы»).
Блокировки СУБД, используемые в транзакции в зависимости от режима управления блокировкой данных, версии платформы и от СУБД
 Вид блокировки  Уровень изоляции транзакций
1С 8.2  1С 8.3
Автоматические блокировки
 Файловая БД Таблиц Serializable Serializable
 MS SQL Server Записей Repeatable Read или Serializable Repeatable Read или Serializable
 IBM DB2 Записей Repeatable Read или Serializable Repeatable Read или Serializable
 PostgreSQL Таблиц Serializable Serializable
 Oracle Database Таблиц Serializable Serializable
Управляемые блокировки
 Файловая БД Таблиц Serializable Serializable
 MS SQL 2000 Записей Read Committed Read Committed
 MS SQL 2005+ Записей Read Committed Read Committed Snapshot
 IBM DB2 Записей Read Committed Read Committed
 PostgreSQL Записей Read Committed Read Committed
 Oracle Database Записей  Read Committed Read Committed

Repeatable Read — используется для объектных сущностей (ссылочные типы), Serializable — для необъектных.

Блокировки СУБД, используемые вне транзакции в зависимости от режима управления блокировкой данных и от СУБД
Чтение вне транзакции
Автоматические блокировки
Файловая БД Read Uncommitted
MS SQL Server Read Uncommitted
IBM DB2 Read Uncommitted
PostgreSQL Read Committed
Oracle Database Read Committed
Управляемые блокировки
 Файловая БД Read Uncommitted
 MS SQL Server 2000 Read Unсommitted
 MS SQL Server 2005 и выше Read Committed Snapshot
 IBM DB2 до версии 9.7 Read Unсommitted
 IBM DB2 версии 9.7 и выше Read Committed
 PostgreSQL Read Committed
 Oracle Database Read Committed

Источники:
• ИТС: Работа с данными
• ИТС: Общие сведения о блокировках
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 37-42.


WAL (Write Ahead Log) — опережающий лог действий с таблицами и индексами. Основная задача — целостность и отказоустойчивость базы данных при одновременном росте производительности.
Источники:
• wiki: Write-ahead logging


Во внешней памяти базы данных находится некоторый объект базы данных, по отношению к которому выполнена операция модификации, то во внешней памяти журнала обязательно находится запись, соответствующая этой операции.
Источники:
• wiki: Write-ahead logging


Транзакция (transaction) — минимальная логически осмысленная операция, которая имеет смысл и может быть совершена только полностью. Транзакция (transaction) — это неделимая, с точки зрения воздействия на базу данных, последовательность операций манипулирования данными, выполняющаяся по принципу «все или ничего», и переводящая базу данных из одного целостного состояния в другое целостное состояние. Если по каким-либо причинам одно из действий транзакции невыполнимо или произошло какое-либо нарушение работы системы, база данных возвращается в то состояние, которое было до начала транзакции (происходит откат транзакции).
Источники:
• ИТС: Общие сведения о транзакциях и блокировках СУБД
• wiki: Транзакция


UNDO логи — хранят старые версии данных.


Согласованность (ACID: Consistency) — по завершении, транзакция должна оставить все данные в согласованном состоянии, является необходимым условием для обеспечения надежности.
Источники:
• wiki: Consistency


REDO логи — хранят новые версии данных.


Атомарность (ACID: Atomicity) — гарантирует, что никакая транзакция не будет зафиксирована в системе частично.
Источники:
• wiki: Atomicity


«1С:Предприятие 8» не поддерживает вложенных транзакций. Это значит, что, фактически, поддерживается только один уровень транзакции. То есть не существует возможности отменить действие транзакции некоторого уровня, не отменяя транзакции вышестоящего уровня.
Источники:
• Вложенность транзакций


Без ожиданий будет прочитана версия данных, согласованная на момент начала второй транзакции. Такое поведение будет благодаря уровню изоляции транзакции (см. пункт 1).


Данные могут быть прочитаны после окончания блокирующей транзакции, но так же может возникнуть конфликт блокировок (см. пункт 1).


Read Committed Snapshot для MS SQL Server — в базу tempdb.
Источники:
• MSDN: Snapshot Isolation in SQL Server


Что бы определить, что используется именно автоматический режим управления блокировками необходимо посмотреть свойство конфигурации «Режим управления блокировкой данных».


Согласно пункта 1, в тексте запроса пришедшим на MS SQL Server есть подстрока WITH SERIALIZABLE или WITH REPEATABLE READ.


ACID  транзакция является последовательностью операций, выполненных как одна логическая единица работы. Логическая единица работы должна обладать четырьмя свойствами:
• Атомарность (Atomicity)  все или ничего; транзакция должна или пройти или не пройти полностью;
Согласованность или консистентность (Consistency) — каждая успешная транзакция по определению фиксирует только допустимые результаты, не нарушает бизнес-логику и отношения между элементами данных;
Изолированность (Isolation) — обеспечение целостности данных независимо от действий других пользователей;
Надежность или устойчивость (Durability) — после своего завершения она сохраняется в системе, которую ничто не может вернуть в исходное (до начала транзакции) состояние.
Источники:
wiki: ACID


Транзакции и блокировки тесно связаны друг с другом. Транзакции накладывают блокировки на данные, чтобы обеспечить выполнение требований ACID.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 51.


Наиболее распространенным в централизованных СУБД (включающих системы, основанные на архитектуре «клиент-сервер») является подход, основанный на соблюдении двухфазного протокола синхронизационных захватов объектов баз данных (Two-Phase Locking Protocol, 2PL).
Источники:
• wiki: Two-phase locking


В общих чертах подход двухфазного протокола синхронизационных захватов объектов баз данных (Two-Phase Locking Protocol, 2PL) состоит в следующем  первая фаза транзакции — накопление захватов; вторая фаза (фиксация или откат) — освобождение захватов.
Источники:
• wiki: Two-phase locking


При редактировании данных в формах, платформа «1С:Предприятие 8» автоматически устанавливает блокировку объекта, указанного в качестве основного реквизита формы. Расширение формы устанавливает пессимистичную блокировку объекта.
Источники:
• ИТС: Блокировки данных в 1С:Предприятии 8
• ИТС: Блокировка данных объекта


Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.
Источники:
• ИТС: Блокировки данных в 1С:Предприятии 8
• ИТС: Блокировка данных объекта


Оптимистичная блокировка держиться пока объект есть в памяти.
Источники:
• ИТС: Блокировки данных в 1С:Предприятии 8
• ИТС: Блокировка данных объекта


«1С:Предприятие 8» не поддерживает вложенных транзакций. Это значит, что, фактически, поддерживается только один уровень транзакции. То есть не существует возможности отменить действие транзакции некоторого уровня, не отменяя транзакции вышестоящего уровня.
Источники:
• Вложенность транзакций


Настройка технологического журнала, в который будут попадать все длительные события,  может выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\LongEvents" history="28">
  <event>
    <ne property="Name" value=""/>
    <ge property="Durationus" value="20000000"/>
  </event>
    <property name="all"/>
</log>
</config>

Файл настройки приведен для версии технологической «1С:Предприятие 8.3», в фильтре по полю Durationus указано время 20 секунд (в микросекундах). Все события, которые попадают в такой журнал (при нормальной работе системы такой журнал должен быть скромных размеров) должны быть предметом рассмотрения, в первую очередь события SDBL со свойством Func=CommitTransaction. Такие события будут иметь длительность внешней (вложенные транзакции технологической платформой не поддерживаются) транзакции. Если транзакция длится более 20 секунд (скорее всего, в рамках транзакции будут установлены транзакционные блокировки на какие-либо ресурсы), она может стать «виновником» ошибок блокировок. Также внимание стоит уделить длительным запросам.
Источники:
• Мониторинг на продукционных серверах

Petro Bazeliuk

Записи

Опыт работы с «1С:Предприятие 8» — более 10 лет, за это время реализовано 30 успешных проектов по итеративным методологиям Scrum и Kanban. Оптимальные решения для высоконагруженных ИБ с онлайном от 400 человек. Занимаюсь продвижением в массы системы контроля версий — git и методики git-flow, TDD, BDD, а также проработкой паттерна минимальной модификации конфигурации и внесением изменений без обновления базы данных. Время от времени участвую в проекте xUnitFor1C.

Комментариев нет

Be the first to start the conversation!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s