Длинные блокировки |
||||
Главная | Программные продукты | Freesource программные продукты | Статьи по Tcl/Tk | Статьи | Контакт | Карта сайта | |||
"Длинные блокировки"Очень часто, при разработке прикладных программ, возникает необходимость заблокировать группу строк в БД на довольно длительное время, порядка десятков минут. Например, модификация ранее введенного счета. Я понимаю, что это можно сделать и средствами СУБД, открыв курсор для изменения, но во-первых, - "Как передать эту блокировку другому пользователю, который просматривает эти строки, естественно уже в режиме только для чтения ?", и во-вторых, мне кажется с точки зрения сегодняшнего дня - СУБД нужно использовать скорее как хранилище. Триггера, хранимые процедуры - это рудимент двухуровневой архитектуры клиент-сервер. Конечно, существуют и исключения, но ... . Терминология.В контексте данной статьи, термин длинные блокировки означает: Запрет модификации и удаления строк в таблицах БД другими пользователями, за исключением пользователя, установившего длинную блокировку. Постановка задачи.Система должна обеспечить решение следующих проблем:
Решение проблемы.Уточню: Нельзя беспорядочно блокировать то, или другое. Длинная блокировка - это скорее, свойство высокоуровневого обьекта, например счета, накладной, чем строки БД. Безусловно блокировки конкурирующих транзакций мы оставляем во власти СУБД, и никоим образом на их классику не посягаем. Длинная блокировка носит информационно-защитный пользовательский характер. Рассмотрим все на примере. Пусть, мы имеем некую накладную. Информация по накладной храниться в конечном множестве строк и конечном множестве таблиц БД. При вызове документа нам необходимо как-то и куда-то внести информацию о том, что данные строки заблокированы. При вызове низкоуровневых функций которые изменяют или удаляют хоть одну строку из набора, нам необходимо принять решение, выполнять или отказать в выполнении данных действий. При выходе из документа (накладной) надо уничтожить информацию о существовавшей блокировке. Информация о существующих блокировках хранится в таблице следующей структуры:
Как это работает ?При вызове документа (накладной), который состоит из шапки накладной (таблица order_head) и товару по накладной (таблица order_tovar), мы записываем в таблицу longlock информацию об извлеченных строках. При выходе из накладной, эти строки должны быть удалены. При корректном выходе из пользовательского приложения это сделать нетрудно. При некорректном - каждый решает эту проблему по-своему. Я, на сервере приложений отслеживаю событие разрыва сокета, и удаляю все строки из longlock принадлежащие этому сокету. Допустим, user1 заблокировал все строки накладной1. Что происходит, если user2 заходит в накладную1 ? Вся информация о строках накладной1 записывается в longlock с характеристиками пользователя user2. При вызове функций изменения (удаления) происходит проверка, а не заблокировал ли другой процесс изменяемую (удаляемую) строку. Если нет. то нет. Когда user1 выходит из накладной, учитывая время блокировки, длинная блокировка как-бы передается пользователю2. Псевдокод.Опишем все вышесказанное на псевдоязыке:
|
||||||||||||||||||||
Copyright © Эдуард Зозуля | ||||||||||||||||||||