Using Hecl on Android

Tkzinc и кириллица

Поле связанных структур

Длинные блокировки

Единая страна

Длинные блокировки

Длинные блокировки

"Длинные блокировки"

Очень часто, при разработке прикладных программ, возникает необходимость заблокировать группу строк в БД на довольно длительное время, порядка десятков минут. Например, модификация ранее введенного счета. Я понимаю, что это можно сделать и средствами СУБД, открыв курсор для изменения, но во-первых, - "Как передать эту блокировку другому пользователю, который просматривает эти строки, естественно уже в режиме только для чтения ?", и во-вторых, мне кажется с точки зрения сегодняшнего дня - СУБД нужно использовать скорее как хранилище. Триггера, хранимые процедуры - это рудимент двухуровневой архитектуры клиент-сервер. Конечно, существуют и исключения, но ... .

Терминология.

В контексте данной статьи, термин длинные блокировки означает: Запрет модификации и удаления строк в таблицах БД другими пользователями, за исключением пользователя, установившего длинную блокировку.

Постановка задачи.

Система должна обеспечить решение следующих проблем:

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

Решение проблемы.

Уточню: Нельзя беспорядочно блокировать то, или другое. Длинная блокировка - это скорее, свойство высокоуровневого обьекта, например счета, накладной, чем строки БД. Безусловно блокировки конкурирующих транзакций мы оставляем во власти СУБД, и никоим образом на их классику не посягаем. Длинная блокировка носит информационно-защитный пользовательский характер.

Рассмотрим все на примере. Пусть, мы имеем некую накладную. Информация по накладной храниться в конечном множестве строк и конечном множестве таблиц БД. При вызове документа нам необходимо как-то и куда-то внести информацию о том, что данные строки заблокированы. При вызове низкоуровневых функций которые изменяют или удаляют хоть одну строку из набора, нам необходимо принять решение, выполнять или отказать в выполнении данных действий. При выходе из документа (накладной) надо уничтожить информацию о существовавшей блокировке.

Информация о существующих блокировках хранится в таблице следующей структуры:

Table longlock
Field Comment
id_socket Поле, однозначно идентифицирующее кто и откуда запрашивает блокировку. (В моей прикладной программе это ноомер сокета, назначеный уровнем приложения)
tbl_name Имя таблицы, строки которой желаем заблокировать.
row_id ID строки которую желаем заблокировать.
datetime Дата и время блокировки.

Как это работает ?

При вызове документа (накладной), который состоит из шапки накладной (таблица order_head) и товару по накладной (таблица order_tovar), мы записываем в таблицу longlock информацию об извлеченных строках. При выходе из накладной, эти строки должны быть удалены. При корректном выходе из пользовательского приложения это сделать нетрудно. При некорректном - каждый решает эту проблему по-своему. Я, на сервере приложений отслеживаю событие разрыва сокета, и удаляю все строки из longlock принадлежащие этому сокету.

Допустим, user1 заблокировал все строки накладной1. Что происходит, если user2 заходит в накладную1 ? Вся информация о строках накладной1 записывается в longlock с характеристиками пользователя user2. При вызове функций изменения (удаления) происходит проверка, а не заблокировал ли другой процесс изменяемую (удаляемую) строку. Если нет. то нет. Когда user1 выходит из накладной, учитывая время блокировки, длинная блокировка как-бы передается пользователю2.

Псевдокод.

Опишем все вышесказанное на псевдоязыке:

Операции с таблицей longlock.
            # установка блокировки для строки row_id в таблице tbl_name
            proc longlock_setlock ( id_socket tbl_name row_id ) {
              insert into longlock values (id_socket, tbl_name, row_id, current)
            }
            
            # снятие блокировки всех строк для таблицы tbl_name
            proc longlock_unsetlock ( id_socket tbl_name ) {
              delete from longlock where id_socket = id_socket and tbl_name = tbl_name
            }
            
            # снятие блокировки со всех строк для сокета
            proc longlock_droplock ( id_socket ) {
              delete from longlock where id_socket = id_socket
            }
            
            # проверка, а не заблокирована строка row_id в таблице tbl_name для сокета id_socket
            proc longlock_existlock ( id_socket tbl_name row_id ) {
              if exists select id_socket from longlock where tbl_name = tbl_name and row_id = row_id and id_socket != id_socket
              then
                return exists              
              else
                return notexists
              end if
            }
    
Операции с таблицей order_tovar.
            # извлечение товара по накладной
            foreach select id, data from order_tovar where order_id = order_id
              longlock_setlock(id_socket order_tovar id)
            end foreach
                    
            # модификация (удаление/изменение) товара по накладной
            if (longlock_existlock(id_socket, order_tovar, row_id) != "exists" ) {
              delete or update order_rovar where id = row_id
            }
            
            # снятие блокировки со всех строк для таблицы order_rovar
            longlock_unsetlock(id_socket, order_tovar)
    
Событие разрыва сокета.
            longlock_droplock( id_socket )
    
Главная
Программные продукты
Freesource программные продукты
Статьи
Контакт
GPSMWL - GPS мониторинг для социальных проектов
GPSMTA - GPS трекер / GPS мониторинг для Android
GPSM - программно-аппаратный комплекс GPS мониторинга
MapTour - GPS навигация для Туристов
MapSurfing - просмотрщик географических карт
DGraf - визуализация графов
ViCer - домашняя система видеонаблюдения
FPS - бесплатная система GPS мониторинга
Jeans - Финансово-складской учёт
Cerber - Финансовый учёт игорного зала
Visimap - Визуальная карта
BIB - Картотека книг
2DO - Учёт рабочего времени
Выписка - склад
Расчёт зарплаты
Krp - визуализатор связанных структур
Xboat - проэктировщик малых судов
XSQLite - visualisator DB SQLite
Текстовый редактор XEdJ
Copyright © Эдуард Зозуля
Проверка PR и ТИЦ