|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от Perc
![]() Про "начало" и "конец" транзакции в стандарте - так там и есть на самом деле все в обычном понимании стандартно. В классе ReqCalc:
ttsbegin; this.insertData(); ... ttscommit; В функции insertData() и очистка ReqTrans и RecTransCov присутсвует в прямом виде. А отдельная сессия есть в этом классе, но она имхо ничего кроме блокировки записи в таблице планов не делает вообще: connectionLock = new UserConnection(); connectionLock.ttsbegin(); reqPlanLock.setConnection(connectionLock); select forupdate reqPlanLock where reqPlanLock.reqPlanId == reqPlanId; Видимо это просто способ запрета паралельного запуска того же расчета с другого места всего лишь. connectionLock = new UserConnection(); connectionLock.ttsbegin(); reqPlanLock.setConnection(connectionLock); select forupdate reqPlanLock where reqPlanLock.reqPlanId == reqPlanId; ... блокируют всего 1 таблицу reqPlan, и действительно для того чтобы остальные "желающие" подождали. Так как же у вас сделано? Полностью стандарт или что то дописали? |
|
![]() |
#2 |
Участник
|
this.ttsbegin() и this.ttscommit() к начальной теме вопроса:
Начало транзакции; Очистить прогнозный план запущеный на расчет; Рассчитать прогнозный план; Конец транзакции; не имеют никакого отношения. Они в паралельной сессии блокируют/отпускают запись единственную. Все. Я имел ввиду код в методе UpdateData класса ReqCalc: ttsbegin; this.insertData(); ... ttscommit; Этот код у меня на слое sys, и ttsbegin; ttscommit; там самые обыкновенные, а метод insertData() чистит план и выполняет часть расчета плана - запоняет ReqTrans. |
|