18
Введение в транзакционные блокировки

вебинар транзакционные блокировки

Embed Size (px)

Citation preview

Введение в транзакционные блокировки

Транзакция

Транзакция – это неделимая с точки зрения воздействия на базу данных, последовательность операций манипулирования данными, выполняющаяся по принципу: «или все, или ничего».

Ошибки которые могут произойти в рамках транзакции подразделяются на:• Не восстановимые (система откатывает транзакцию назад и прекращает свою работу)• Восстановимые (система в принципе остается работоспособной)Восстановимые ошибки в свою очередь делятся на:• Ошибки связанные с базой данных (в этом случае в обязательном порядке будет

произведен откат транзакции)• Ошибки не связанные с базой данных (разработчик может проанализировать эту

ошибку в конструкции «Попытка/Исключение» и решить будет транзакция продолжаться или будет прервана).

Система осуществляет неявный вызов транзакций при выполнении любых действий, связанных с изменением данных, хранящихся в информационной базе.

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

Наряду с этим разработчик может использовать возможность определять транзакции в явном виде, с помощью средств встроенного языка.

Конкурентный ресурс

«Конкурентный ресурс», это некий ресурс системы (остаток товара на складе, величина задолженности контрагента и т.п., который используется в системе для реализации прикладной логики. По значению данного ресурса система с точки зрения прикладной логики принимает решение: фиксировать данную транзакцию или нет. Для обеспечения этой логики нужно обеспечить «неизменность» значения «конкурентного» ресурса на время течения прикладной транзакции.

User
В рамках транзакции может происходить как чтение из базы данных, так и запись в нее. Если транзакция занимается обеспечением прикладной логики, то данные по которым она это делает должны удовлетворять следующим требованиям:- Чтение таких данных должно быть воспроизводимым- Результат чтения должен содержать наиболее актуальные данные- Результат чтения не должен содержать незафиксированные изменения

Уровни изоляции транзакций

• «Read Uncommited» - так называемое «грязное чтение». Используется при чтении данных. В результат чтения могут войти данные внесенные (измененные) еще не зафиксированной транзакцией.

• «Read Commited» - решает проблему грязного чтения. В результат чтения входят наиболее актуальные данные. Результат не содержит не зафиксированных изменений.

• «Repeatable Read» - воспроизводимое чтение. При установке данного уровня изоляции на прочитанные данные накладывается блокировка, препятствующая их изменению из другой транзакции. Т.е. если данные будут прочитаны в начале транзакции (и установлен такой уровень изоляции), то при чтении данных в конце транзакции они будут точно такими же.

• «Serializable» - решает так называемую «фантомную» проблему. Проблема заключается в том, что когда в начале транзакции считывается некий набор данных, то если произвести чтение этого набора в конце транзакции он будет содержать лишние записи.

Сравнительная таблица режимов работы с транзакционными блокировками:

Повышение уровня блокировкиСуть данной ситуации: две транзакции первоначально параллельно накладывают на одни и те же данные разделяемую блокировку, а потом пытаются разделяемую переключить на исключительную. В результате возникает взаимоблокировка.

Начало транзакций

Чтение данных Чтение данныхРазделяемая Разделяемая

Обработка данных Обработка

данныхЗапись данных

Исключительная

Запись данных

Исключительная

Взаимоблокировка

|ДЛЯ ИЗМЕНЕНИЯ| РегистрНакопления.ОстаткиНоменклатуры.Остатки";

Начало транзакций

Чтение данных Чтение данныхОбработка

данных

Обработка данных

Запись данных

Исключительная

Запись данных

Исключительная

Обращение к данным в разном порядке

Начало транзакций

Чтение данных(ост.) Чтение данных

(рез.)

Исключительная(ост)

Исключительная(рез.)

Чтение данных(рез.) Чтение данных

(ост.)

Взаимоблокировка

Другие причины, сказывающиеся на параллельности работы системы:• Неоптимальное написание (работа) запросов• Большая вложенность подзапросов, соединения с подзапросами• Несоответствие индексов и условий запроса• Некорректное использование параметров виртуальных таблиц• Отсутствие функции ВЫРАЗИТЬ для полей составного типа• Получение лишних полей через точку

Видео канал KoderLine: goo.gl/eqGWK1

Управляемый режим работы с транзакционными блокировками

Режим разделения итогов

Совместное использование автоматического и управляемого режимовРежим существующей транзакции

Режим начинаемой транзакции Результат

Автоматический Автоматический Начинаемая транзакция будет выполнена в автоматическим режиме

Управляемый Управляемый Начинаемая транзакция будет выполнена в управляемом режиме

Автоматический Управляемый Начинаемая транзакция будет выполнена в автоматическим режиме

Управляемый Автоматический Будет вызвана исключительная ситуация

Свойство «Удаление движений»

Записывать выбранныеСуть значения «Записывать выбранные» в том, что записываются только те наборы, для которых вы явно это укажите. У коллекции «Движения.ИмяРегистра» появилось свойство «Записывать». При выходе из обработки проведения в регистры сбрасываются данные только тех коллекций, у которых свойство «Записывать» установлено в значение «Истина».

Движения.ОстаткиТоваров.Записывать = Истина;

Также у свойства документа «Движения» появился метод «Записать()». Он «принудительно сбрасывает» данные в регистры только по тем наборам, у которых свойство «Записывать» установлено в значение «Истина».

Движения.Записать();

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

Движения.ОстаткиНоменклатуры.Записать();

Блокировать для изменения

Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина;

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

КонтактыЕсть вопросы? Мы поможем! Свяжитесь с нами удобным для нас способом.

Прямые контактыАндрей БербекаРуководитель проектного направленияТелефон:+7 (495) 135-22-96Email:[email protected]:andrijberbeka

Игорь ШлепановРуководитель Департамента по работе с корпоративными клиентамТелефон:+7 (495) 135-22-96Email:[email protected]:igor_shlepanov

Владимир КостюкРуководитель отдела разработкиEmail:[email protected]:vkostyuk.koderline

Юлия ЗореваРуководитель коммерческой службыEmail:[email protected]:uzoreva-koderline