|
|
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Оракл 8.1.7 В MDI-приложении, работающем через ODAC, при открытии документа блокирую запись, чтобы её не мог изменить другой юзер, через SELECT FOR UPDATE NOWAIT. Всё нормально блокируется. Открываю какой-нить справочник, меняю там данные, сохраняю, при этом данные коммитятся. И всё - блокировка снимается. Не могу разобраться, как сделать так, чтобы при коммите в справочнике не снималась блокировка документа. Или мобыть как-то по другому всё сделать :-)) Раньше приложение было SDI, и этой проблемы не стояло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 13:11 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Ты транзакцию завершаешь, и конечно все исчезает. Опять блакируй их и все тут после коммита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 15:00 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Ispolzui SAVEPOINT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 15:56 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
и что это даст если ему надо Коммит делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 16:33 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
No savepoint + dbms_transaction ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 16:35 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
ну и что это получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 16:55 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
-- Ubery v ODBC autocommit (esli est). -- posle update/insert spravochnika ne komit (dannye budut vidny v tekuschey sessii, a ostalnye mogut 2-3min podogdat) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2003, 20:10 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Ещё безумные варианты включают отдельное соединение (=сессию) для каждого окна (во всяком случае справочника) и autonomous transaction, если второе соединение устанавливать нельзя. По сути, у тебя всё живёт в одной сессии, и commit, сделанный для того, чтобы изменить глобально классификатор, разумеется завершил транзакцию (ну и заодно снял блокировку). Т.о. тебе нужно решить, что должно случаться с изменениями в классификаторе, если исправляется документ: если видны всем и сразу, без возможности отката, то смотри выше а вот если должны погибнуть, если юзверь откажется от изменения документа, то просто не делай commit при изменении справочника (правда иногда это чревато блокировками других юзверей) Кстати, а проблему редактирования разных документов в разных окнах ты будешь решать когда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2003, 02:04 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Да полно проблем при многооконном интерфейсе и с блокировками и со всем остальным :-) Если использовать отдельные соединения для справочников и документов, то юзер может сам себя заблокировать. А как вообще народ с данной проблемой борется, не у меня одного ведь такие задачи :-) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2003, 07:57 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Сколько видел приложений работающих с БД, все они были SDI. Ну в лучшем случае, два окошка параллельных окошка. Но не более. То есть, если юзверь хочет редактировать ещё что-то, то он вынужден запустить ещё один экземпляр приложения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2003, 01:21 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
В SDI-версии всё нормально работает, никто не жаловался :-) Но вот появились клиенты, которые приучены работать в MDI-проге под Interbase (правда, там и блокировок документов нет). И говорят - хотим MDI и всё тут. Хочется всё по уму сделать ... А если хранить в табличке список открытых документов (Ид док-та, имя юзера и номер сессии), и перед открытием проверять. А для обработки аварийного отваливания клиента повесить какой-нить триггер... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2003, 02:57 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2003, 08:16 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
С самого начала - есть клиент-серверная система товарно-складского учета. По логике работы в таких системах должно быть реализовано блокирование документа, если он у кого-нибудь уже открыт. Т.е. если заявку корректирует один менеджер, второй не мог бы ее открыть (ну или мог открыть, но без возможности изменения данных). Если с SELECT FOR UPDATE NOWAIT данный вопрос не решается, то как его можно решить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2003, 10:36 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Для редактирования справочников без снятия блокировки с документа может быть поможет процедура с pragma autonomous_transaction, здесть она периодически всплывает как панацея именно для таких задач. Мне знаком еще один вариант корпоративной работы над документами, и если способ с select .. for update можно назвать "пессимистическим", т.е. мы с большой долей вероятности предполагаем, что кто-то еще захочет поменять документ, то "оптимистический" будет выглядеть так: в таблице заводится еще одно поле, счетчик, или timestamp, по желанию, пусть оно так и называется. 1. При выборке документа получаешь значение этого поля. 2. При сохранении документа запрос дописываешь условием, по псевдокоду: Код: plaintext 1. 2. 3. 4. 5. 6. Если в данной записи значение timestamp уже поменялось, то запрос не изменит ни одну запись в таблице. На основании этого факта мы делаем вывод, что документ кем-то уже изменен, о чем уведомляем пользователя, откатывая все его изменения и перечитывая данные записи вновь. Плюс такого подхода- отсутствие долговременных блокировок в БД; транзакции, как и положено в OLTP-системах, максимально коротки. Минус- пользователь, после кропотливого изменения документа получает уведомление, что, мол, забей на все и начни сначала. Но как ему об этом по-возможности мягче сказать и состоит задача разработчика:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2003, 10:56 |
|
||
|
Вопрос по SELECT FOR UPDATE NOWAIT
|
|||
|---|---|---|---|
|
#18+
Создай в таблице дополнительное поле 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2003, 11:13 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32110729&tid=1991717]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 456ms |

| 0 / 0 |
