Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / DW Lock + UPDATE / 4 сообщений из 4, страница 1 из 1
19.08.2008, 13:50
    #35494794
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DW Lock + UPDATE
РВ 8.0, SQL Anywhere 9.
База данных на сервере. Прога установлена на каждом компьютере локально.
На одном окне имеется dw_1. Делаем dw_1.Retrieve(order_number). Теперь, если на другом компе сделать UPDATE из скрипта того заказа, который был выбран на предыдущем компьютере, то происходит зависание до тех пор, пока не закроется окно с dw_1 на первом компе. Это нормально. Вопрос такой:
Перед тем, как сделать на втором компьютере
Код: plaintext
1.
2.
UPDATE t_order
SET MMM = 'NNN'
WHERE order_number = :ll_order_number;
Нужно выяснить, не выбрал ли (dw_1.Retrieve) кто-то этот заказ раньше.
order_number - ключ в таблице t_order.
Можно, конечно сохранять все номера заказов, с которыми в данный момент идет работа. Но если есть какая-нибудь проверка на "Lock" было бы лучше.
...
Рейтинг: 0 / 0
19.08.2008, 14:20
    #35494937
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DW Lock + UPDATE
RiskaРВ 8.0, SQL Anywhere 9.
База данных на сервере. Прога установлена на каждом компьютере локально.
На одном окне имеется dw_1. Делаем dw_1.Retrieve(order_number). Теперь, если на другом компе сделать UPDATE из скрипта того заказа, который был выбран на предыдущем компьютере, то происходит зависание до тех пор, пока не закроется окно с dw_1 на первом компе. Это нормально. Вопрос такой:
Перед тем, как сделать на втором компьютере
Код: plaintext
1.
2.
UPDATE t_order
SET MMM = 'NNN'
WHERE order_number = :ll_order_number;
Нужно выяснить, не выбрал ли (dw_1.Retrieve) кто-то этот заказ раньше.
order_number - ключ в таблице t_order.
Можно, конечно сохранять все номера заказов, с которыми в данный момент идет работа. Но если есть какая-нибудь проверка на "Lock" было бы лучше.
1. Это вопрос в форум по ASA.
2. Такое поведение Retrieve, если это не сделано специально (напр. указанием подсказке в операторе select) в общем случае есть зло - т.к. мешает многопользовательской работе.
...
Рейтинг: 0 / 0
19.08.2008, 20:33
    #35495806
voronk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DW Lock + UPDATE
Риска, может не совсем то, что тебе надо, но мне кажетса, поменяй where clause у Update.
Делай полный запрос, т.е. будет не
UPDATE t_order
SET MMM = 'NNN'
WHERE order_number = :ll_order_number;

а

UPDATE t_order
SET MMM = 'NNN'
WHERE order_number = :ll_order_number and mmm = :mmm_original_value_retrieved_from _db;

выбрасывай 'Row changed between retrieve and update' или обработай sqldbcode = -3 и выкинь свою мэссагу ...

запирать всю базу данных на кто его знает сколько времени ... не солидно ... имхо

есть ешё вариант, я использую в одном из процессов, что бы балбесы одновременно не долбили кэш на аккаунт.

на таблице апдейта ест; колонка user_skey int null, каждый юзер имеет свой уникальный user_skey, дык вот, как только один из них сделал ретрив, я тут же делаю апдейт этой колонки и втыкаю в неё это самое значение, когда другой усер пытаетса сделать такой же ретрив, в процедуре этой датавинды перед селектом у меня стоит if exists (select * from bla-bla-bla where bla-bla-bla and user_skey is not null) begin RAISERROR ... end и он получает откат, со словами что в эту минуту этим процессом занимаетса другой индивидум, и он может пока покурить ...
update колонки user_skey обратно на null, я делаю на закрытии окна.
Я конечно всё очень примитивно изложил, но я думаю you got an idea ...
...
Рейтинг: 0 / 0
20.08.2008, 10:30
    #35496249
VanoR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DW Lock + UPDATE
RiskaРВ 8.0, SQL Anywhere 9.
База данных на сервере. Прога установлена на каждом компьютере локально.
На одном окне имеется dw_1. Делаем dw_1.Retrieve(order_number). Теперь, если на другом компе сделать UPDATE из скрипта того заказа, который был выбран на предыдущем компьютере, то происходит зависание до тех пор, пока не закроется окно с dw_1 на первом компе. Это нормально. Вопрос такой:
Перед тем, как сделать на втором компьютере
Код: plaintext
1.
2.
UPDATE t_order
SET MMM = 'NNN'
WHERE order_number = :ll_order_number;
Нужно выяснить, не выбрал ли (dw_1.Retrieve) кто-то этот заказ раньше.
order_number - ключ в таблице t_order.
Можно, конечно сохранять все номера заказов, с которыми в данный момент идет работа. Но если есть какая-нибудь проверка на "Lock" было бы лучше.
Commit после dw_1.Retrieve(order_number) поможет
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / DW Lock + UPDATE / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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