|
|
|
Проблема с хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
Проблема в следующем: 2 клиента. Если на 1 выполняется 2 процедура, а на 2, через некоторое время 1(:ipPR один и тот же) то выдается ошибка. о незавершённости транзакции. Если значение :ipPR разное проблем нет. Текст 1 процедуры DECLARE VARIABLE FAMIL VARCHAR(20); DECLARE VARIABLE NAM VARCHAR(20); DECLARE VARIABLE OTC VARCHAR(20); DECLARE VARIABLE STAT VARCHAR(20); DECLARE VARIABLE OTD VARCHAR(20); begin begin select fam,name,ot,status,otdel from users where pr=:ipPR into :famil,:nam,:otc,:stat,:otd; insert into log (pr,fam,name,ot,status,otdel,sys_date,date_in) values (:ipPR,:famil,:nam,:otc,:stat,:otd,:ipDate,:ipDate); update users set IN_OUT = "1" where PR = :ipPR; end suspend; end Текст 2 процедуры DECLARE VARIABLE FAMIL VARCHAR(20); DECLARE VARIABLE NAM VARCHAR(20); DECLARE VARIABLE OTC VARCHAR(20); DECLARE VARIABLE STAT VARCHAR(20); DECLARE VARIABLE OTD VARCHAR(20); begin begin select fam,name,ot,status,otdel from users where pr=:ipPR into :famil,:nam,:otc,:stat,:otd; insert into log (pr,fam,name,ot,status,otdel,sys_date,date_out) values (:ipPR,:famil,:nam,:otc,:stat,:otd,:ipDate,:ipDate); update users set IN_OUT = "0" where PR = :ipPR; end suspend; end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 13:47 |
|
||
|
Проблема с хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
Ну так видать транзакции у тебя неправильно обрабатываются. Если поцедура 1 не подтверждена, то при выполнении процедуры 2 должен быть dead lock, поскольку оба пишут в одну и ту же запись при одинаковых ipPR. Про транзакции читать на ibase.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 14:20 |
|
||
|
Проблема с хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
а как правильно? ответ. в клиенте делать бегинтран - коммит. ы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 14:22 |
|
||
|
Проблема с хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
Используйте компоненты прямого доступа - IB Express, IBX или, еще лучше - FIBPlus. Там хочешь - не хочешь, придется разобраться с транзакциями. В общем, принцип такой - //--- Клиент хочет изменять данные: try Start Transaction ... // Клиент меняет данные ... Commit // Все в порядке, данные изменены, можно позволить другим // клиентам читать мои изменения except // Ошибка RollBack // Все изменения отменяются, другие клиенты // ничего не заметят... end //----------- Для операции чтения обычто используют "длинную" транзакию, которая одна на все время жизни приложения, в ней ничего не изменяют, только читаю данные из базы. Для операции изменения (быстро-быстро) создают пишущую транзакцию, как описано выше, которую после операции изменения завершают (или Commit - подтверждение, или RollBack - откат). Возможны варианты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 16:46 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32298364&tid=1579781]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 336ms |

| 0 / 0 |
