Компания "Кодерлайн" 29 июля 2015 г. провела вебинар "Введение в транзакционные блокировки". Ведущий - руководитель отдела компании Владимир КОСТЮК, Он же автор презентации.
2. Транзакция
Транзакция – это неделимая с точки зрения воздействия на базу данных,
последовательность операций манипулирования данными, выполняющаяся по
принципу: «или все, или ничего».
Ошибки которые могут произойти в рамках транзакции подразделяются на:
• Не восстановимые (система откатывает транзакцию назад и прекращает свою
работу)
• Восстановимые (система в принципе остается работоспособной)
Восстановимые ошибки в свою очередь делятся на:
• Ошибки связанные с базой данных (в этом случае в обязательном порядке будет
произведен откат транзакции)
• Ошибки не связанные с базой данных (разработчик может проанализировать эту
ошибку в конструкции «Попытка/Исключение» и решить будет транзакция
продолжаться или будет прервана).
3. Система осуществляет неявный вызов транзакций при выполнении любых действий,
связанных с изменением данных, хранящихся в информационной базе.
Режим работы с данными вне транзакции допускает только операции чтения данных, т.к.
выполняется «не глядя» на блокировки (например, получение данных отчетом).
Наряду с этим разработчик может использовать возможность определять транзакции в явном
виде, с помощью средств встроенного языка.
4. Конкурентный ресурс
«Конкурентный ресурс», это некий ресурс системы (остаток товара
на складе, величина задолженности контрагента и т.п., который
используется в системе для реализации прикладной логики. По
значению данного ресурса система с точки зрения прикладной
логики принимает решение: фиксировать данную транзакцию или
нет. Для обеспечения этой логики нужно обеспечить
«неизменность» значения «конкурентного» ресурса на время
течения прикладной транзакции.
5. Уровни изоляции транзакций
• «Read Uncommited» - так называемое «грязное чтение». Используется при
чтении данных. В результат чтения могут войти данные внесенные
(измененные) еще не зафиксированной транзакцией.
• «Read Commited» - решает проблему грязного чтения. В результат чтения
входят наиболее актуальные данные. Результат не содержит не
зафиксированных изменений.
• «Repeatable Read» - воспроизводимое чтение. При установке данного
уровня изоляции на прочитанные данные накладывается блокировка,
препятствующая их изменению из другой транзакции. Т.е. если данные будут
прочитаны в начале транзакции (и установлен такой уровень изоляции), то
при чтении данных в конце транзакции они будут точно такими же.
• «Serializable» - решает так называемую «фантомную» проблему. Проблема
заключается в том, что когда в начале транзакции считывается некий набор
данных, то если произвести чтение этого набора в конце транзакции он
будет содержать лишние записи.
7. Повышение уровня блокировки
Суть данной ситуации: две транзакции первоначально параллельно накладывают на одни и те же данные
разделяемую блокировку, а потом пытаются разделяемую переключить на исключительную. В результате возникает
взаимоблокировка.
Начало транзакций
Чтение данных
Чтение данных
Разделяемая Разделяемая
Обработка
данных Обработка
данных
Запись данных
Исключительная
Запись данных
Исключительная
Взаимоблокировка
9. Обращение к данным в разном порядке
Начало транзакций
Чтение данных
(ост.)
Чтение данных
(рез.)
Исключительная
(ост)
Исключительная
(рез.)
Чтение данных
(рез.) Чтение данных
(ост.)
Взаимоблокировка
10. Другие причины, сказывающиеся на
параллельности работы системы:
• Неоптимальное написание (работа) запросов
• Большая вложенность подзапросов, соединения с подзапросами
• Несоответствие индексов и условий запроса
• Некорректное использование параметров виртуальных таблиц
• Отсутствие функции ВЫРАЗИТЬ для полей составного типа
• Получение лишних полей через точку
Видео канал KoderLine: goo.gl/eqGWK1
13. Совместное использование
автоматического и управляемого режимов
Режим существующей
транзакции
Режим начинаемой транзакции Результат
Автоматический Автоматический Начинаемая транзакция будет
выполнена в автоматическим
режиме
Управляемый Управляемый Начинаемая транзакция будет
выполнена в управляемом
режиме
Автоматический Управляемый Начинаемая транзакция будет
выполнена в автоматическим
режиме
Управляемый Автоматический Будет вызвана исключительная
ситуация
15. Записывать выбранные
Суть значения «Записывать выбранные» в том, что записываются только те наборы, для которых вы явно это укажите. У коллекции «Движения.ИмяРегистра» появилось свойство
«Записывать». При выходе из обработки проведения в регистры сбрасываются данные только тех коллекций, у которых свойство «Записывать» установлено в значение «Истина».
Движения.ОстаткиТоваров.Записывать = Истина;
Также у свойства документа «Движения» появился метод «Записать()».
Он «принудительно сбрасывает» данные в регистры только по тем наборам,
у которых свойство «Записывать» установлено в значение «Истина».
Движения.Записать();
Важно отметить, что метод «принудительной» записи, который использовался
ранее, значение флага «Записывать» не сбрасывает.
Движения.ОстаткиНоменклатуры.Записать();
16. Блокировать для изменения
Движения.ОстаткиТоваров.БлокироватьДляИзменения=Истина;
На записываемые данные в момент записи будет установлена
исключительная блокировка. Важно понимать, что блокирование
данных происходит именно в момент записи и то, что указанное
свойство работает в «тандеме» с режимом разделения итогов
регистров накопления и бухгалтерии
18. Прямые контакты
Андрей Бербека
Руководитель проектного направления
Телефон:
+7 (495) 135-22-96
Email:
aberbeka@koderline.ru
Skype:
andrijberbeka
Игорь Шлепанов
Руководитель Департамента по работе
с корпоративными клиентам
Телефон:
+7 (495) 135-22-96
Email:
ishlepanov@koderline.ru
Skype:
igor_shlepanov
Владимир Костюк
Руководитель отдела разработки
Email:
vkostyuk@koderline.ru
Skype:
vkostyuk.koderline
Юлия Зорева
Руководитель коммерческой службы
Email:
uzoreva@koderline.ru
Skype:
uzoreva-koderline