Показать сообщение отдельно
Старый 11.07.2008, 18:14   #12  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,342 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Все очень даже логично. Первый - создает журнал. Другой его разносит. В обоих случаях выбирается номерная серия (хотя насколько я понимаю - не всякие складские журналы при разноске генерят номерную серию - или я неправ?). У нас то были финансовые журналы - а там при разноске всегда генерится что-то новое (ну хотя бы пакет корреспонденции).
Т.о. 1-я проводка взяла новый номер и дальше ей нужно сдвинуть счетчик (сделать select forupdate numbersequencetable). Все вроде ничего... Но массовая разноска делалась что логично - в блоке ttsbegin/ttscommit.
Как известно - независимо от уровней вложенности ttsbegin/ttscommit все выполняется в одной транзакции. Соответственно - в тот момент, когда все думали - что уже в БД все записалось (ttscommit стоит) - в БД ничего не записалось - т.к. это был вложенный ttscommit. Получается, что система ждет завершения последнего ttscommit.
Но последний ttscommit стоит ЗА циклом по разноске (мы же хотим все "оптом" разнести - типа либо все либо ничего). Соответственно - следующая итерация ждет завершения первой. Блокировка.
Вывод. Нужно выделять номера пачками - чтобы система не "лезла" каждый раз бы в БД - чтобы цикл отработал весь - до выделения следующего номера.
__________________
Возможно сделать все. Вопрос времени