powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по SELECT FOR UPDATE NOWAIT
16 сообщений из 16, страница 1 из 1
Вопрос по SELECT FOR UPDATE NOWAIT
    #32109838
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оракл 8.1.7
В MDI-приложении, работающем через ODAC, при открытии документа блокирую запись, чтобы её не мог изменить другой юзер, через SELECT FOR UPDATE NOWAIT.
Всё нормально блокируется.
Открываю какой-нить справочник, меняю там данные, сохраняю, при этом данные коммитятся. И всё - блокировка снимается.
Не могу разобраться, как сделать так, чтобы при коммите в справочнике не снималась блокировка документа.
Или мобыть как-то по другому всё сделать :-))
Раньше приложение было SDI, и этой проблемы не стояло.
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32109925
new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты транзакцию завершаешь, и конечно все исчезает.
Опять блакируй их и все тут после коммита.
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32109968
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ispolzui SAVEPOINT
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32109990
new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и что это даст если ему надо Коммит делать
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32109993
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
No savepoint + dbms_transaction !
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110010
Ораклист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и что это получится
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110102
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-- Ubery v ODBC autocommit (esli est).
-- posle update/insert spravochnika ne komit
(dannye budut vidny v tekuschey sessii, a ostalnye mogut 2-3min podogdat)
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110275
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё безумные варианты включают отдельное соединение (=сессию) для каждого окна (во всяком случае справочника) и autonomous transaction, если второе соединение устанавливать нельзя.

По сути, у тебя всё живёт в одной сессии, и commit, сделанный для того, чтобы изменить глобально классификатор, разумеется завершил транзакцию (ну и заодно снял блокировку).

Т.о. тебе нужно решить, что должно случаться с изменениями в классификаторе, если исправляется документ:
если видны всем и сразу, без возможности отката, то смотри выше

а вот если должны погибнуть, если юзверь откажется от изменения документа, то просто не делай commit при изменении справочника (правда иногда это чревато блокировками других юзверей)

Кстати, а проблему редактирования разных документов в разных окнах ты будешь решать когда?
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110331
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да полно проблем при многооконном интерфейсе и с блокировками и со всем остальным :-)
Если использовать отдельные соединения для справочников и документов, то юзер может сам себя заблокировать.

А как вообще народ с данной проблемой борется, не у меня одного ведь такие задачи :-) ?
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110530
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько видел приложений работающих с БД, все они были SDI. Ну в лучшем случае, два окошка параллельных окошка. Но не более.

То есть, если юзверь хочет редактировать ещё что-то, то он вынужден запустить ещё один экземпляр приложения...
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110535
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SDI-версии всё нормально работает, никто не жаловался :-)

Но вот появились клиенты, которые приучены работать в MDI-проге под Interbase (правда, там и блокировок документов нет). И говорят - хотим MDI и всё тут. Хочется всё по уму сделать ...

А если хранить в табличке список открытых документов (Ид док-та, имя юзера и номер сессии), и перед открытием проверять. А для обработки аварийного отваливания клиента повесить какой-нить триггер... ?
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110559
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Voobshe-to, ispol'zovatie "for update" dolgno bylo byt' obrezano na stadii postanovki zadazh'.
Vse poluchennye predlogeniya horoshi, no tayat v sebe opasnost' Lock & Latch free v Oracle - t.e. postoyannyi monitoring DB/DB Precise & dorogi v smysle resources.
Moget, legche izmenit' logiku zaprocov?
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110643
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С самого начала - есть клиент-серверная система товарно-складского учета. По логике работы в таких системах должно быть реализовано блокирование документа, если он у кого-нибудь уже открыт. Т.е. если заявку корректирует один менеджер, второй не мог бы ее открыть (ну или мог открыть, но без возможности изменения данных). Если с SELECT FOR UPDATE NOWAIT данный вопрос не решается, то как его можно решить ?
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110669
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для редактирования справочников без снятия блокировки с документа может быть поможет процедура с pragma autonomous_transaction, здесть она периодически всплывает как панацея именно для таких задач.

Мне знаком еще один вариант корпоративной работы над документами, и если способ с select .. for update можно назвать "пессимистическим", т.е. мы с большой долей вероятности предполагаем, что кто-то еще захочет поменять документ, то "оптимистический" будет выглядеть так: в таблице заводится еще одно поле, счетчик, или timestamp, по желанию, пусть оно так и называется.

1. При выборке документа получаешь значение этого поля.
2. При сохранении документа запрос дописываешь условием, по псевдокоду:

Код: plaintext
1.
2.
3.
4.
5.
6.
update my_table set 
    field1 = :field1
    ...
  , timestamp = :timestamp +  1 
where id = :id
  and timestamp = :timestamp


Если в данной записи значение timestamp уже поменялось, то запрос не изменит ни одну запись в таблице. На основании этого факта мы делаем вывод, что документ кем-то уже изменен, о чем уведомляем пользователя, откатывая все его изменения и перечитывая данные записи вновь.

Плюс такого подхода- отсутствие долговременных блокировок в БД; транзакции, как и положено в OLTP-системах, максимально коротки.
Минус- пользователь, после кропотливого изменения документа получает уведомление, что, мол, забей на все и начни сначала. Но как ему об этом по-возможности мягче сказать и состоит задача разработчика:)
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110686
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создай в таблице дополнительное поле locked_by и навесь на таблицу триггер, которые позволяет update данной записи только если locked_by is null or locked_by=user.
В форме с которой работает пользователь при выборе данного документа делаем

update <таблица> set locked_by=user where <этот документ>;
commit;

После того, как пользователь отработал с данной записью делаем
update <таблица> set locked_by=null where <этот документ>;
commit;
...
Рейтинг: 0 / 0
Вопрос по SELECT FOR UPDATE NOWAIT
    #32110729
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predudushee reshenie samoe optimal'noe.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по SELECT FOR UPDATE NOWAIT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]