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