Локировки записей

Обсуждение вопросов по разработке программ в среде продуктов копорации "Progress Software"
A_Alex
Старожил
Сообщения: 80
Зарегистрирован: 16 фев 2011, 22:39

Локировки записей

Сообщение A_Alex » 22 мар 2017, 13:50

Добрый день!

Столкнулся с такой проблемой:
1-й пользователь осуществляет поиск записи FIND FIRST c локировкой SHARE-LOCK. Запрос конечно не самый лучший, в плане того что осуществлялся перебором. Пока искомая запись была найдена, был осуществлен перебор нескольких записей и вот на всех перебранных записях, как оказалось, была выставлена локировка SHARE-LOCK. Странно, почему так? Понятно что записи перебирались, но если они не подходили под запрос зачем их локировать? Процедура 1 пользователя осуществляла работу с найденной записью, а в это время...

2-й пользователь осуществлял поиск FIND FIRSTс локировкой EXCLUSIVE-LOCK. Искомой записью 2-го пользователя была одна из тех записей, что перебрал 1-й пользователь пока была найдена интересующая его запись. Тут возникла классическая ошибка, что запись заблокирована 1-м пользователем, хотя он с ней не работает.

Неужели прогресс так работает, или это я что-то не так понимаю?

A_Alex
Старожил
Сообщения: 80
Зарегистрирован: 16 фев 2011, 22:39

Re: Локировки записей

Сообщение A_Alex » 22 мар 2017, 17:35

Извиняюсь, у первого пользователя тоже локировка EXCLUSIVE-LOCK
Смоделировал простую версию:

user1.p:
FIND FIRST loan WHERE CAN-DO("00*0",loan.branch-id) EXCLUSIVE-LOCK.
DISPL loan.cont-code.
PAUSE 100.

user2.p:
FIND FIRST loan WHERE loan.branch-id = "0023" EXCLUSIVE-LOCK.
DISPL loan.cont-code.
PAUSE 100.

Когда первый пользователь запускает свою процедуру локируется ряд записей.

Далее второй попадает на одну из заблокированных 1-м пользователей записей (не на ту что он отобрал)

udg
Старожил
Сообщения: 34
Зарегистрирован: 22 ноя 2012, 07:20

Re: Локировки записей

Сообщение udg » 29 май 2017, 16:57

A_Alex писал(а):Извиняюсь, у первого пользователя тоже локировка EXCLUSIVE-LOCK
Смоделировал простую версию:

user1.p:
FIND FIRST loan WHERE CAN-DO("00*0",loan.branch-id) EXCLUSIVE-LOCK.
DISPL loan.cont-code.
PAUSE 100.

user2.p:
FIND FIRST loan WHERE loan.branch-id = "0023" EXCLUSIVE-LOCK.
DISPL loan.cont-code.
PAUSE 100.

Когда первый пользователь запускает свою процедуру локируется ряд записей.

Далее второй попадает на одну из заблокированных 1-м пользователей записей (не на ту что он отобрал)


Я думаю так происходит из-за конструкции CAN-DO, по ней похоже проверка условия происходит после чтения записи, а AVM пометит все прочтенные записи как EXCLUSIVE-LOCK. Если допустим указать loan.branch-id begins "00" то блокировка будет только 1 записи, даже если под условие попадают несколько.