Регистрация

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

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

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

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

Добрый день!

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

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

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

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

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

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

Извиняюсь, у первого пользователя тоже локировка 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-м пользователей записей (не на ту что он отобрал)

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

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

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

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 записи, даже если под условие попадают несколько.

Вернуться в PROGRESS - 4GL - ПРОГРАММИРОВАНИЕ

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5