Задать вопрос
@nrv

Почему процедура выполняется одновременно несмотря на блокировку?

есть процедура exec_batch_from_id, она выполняет указанный пункт ETL, затем в джобах запускает себя же с указанием следующих пунктов, т. е. может одновременно запустить несколько джобов. и сама она изначально запускается другой процедурой, тоже может несколько раз одновременно запустить

проблема в том, что она (exec_batch_from_id) два раза запускает один пункт, в рассматриваемом кейсе, запускается 2 раза одновременно exec_batch_from_id другой процедурой и каждый из этих инстансов запускает в конце своей работы 23й пункт, чего быть не должно
хотя в начале процедуры стоит:
LOCK TABLE df.batch_log IN ACCESS EXCLUSIVE MODE;
а там других таблиц не используется и всё завязано на эту таблицу в процедуре
моя идея в том что это не даст процедуре исполнятся параллельно
это важно, поскольку запускается-то она паралелльно, но изменения сделанные одним инстансом, должны быть прочитаны другим, иначе да, как раз следующий пункт ETL может быть запущен 2 раза

т. е., как я понимаю, процедура исполняется в рамках транзакции, и хоть комитить там можно, но если есть обработка исключений, то фактически нельзя (а она там есть)
поэтому надо эксклюзивно залочить таблицу, через которую идет вся работа, чтобы, условно, второй инстанс уперся в блокировку, а когда получил, там уже были видны изменения от первого инстанса

в конкурентности опыта нет, может конечно это всё слюни, что я тут развел)
но надо организовать как бы очередь, чтобы второй инстанс видел изменения первого

p.s. отладку сделал через табличку, там видно что работа инстансов пересекается:
67d988515612b264111033.png
id_batch - это номер прогрузки ETL, id - пункт ETL, 21 и 22 как раз 2 стартовых пункта и по сообщениям видно, что они (first 23) запускают 23 пункт каждый и диапазоны start - end пересекаются.
  • Вопрос задан
  • 43 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы