Регистрация  |  Вход

Trigger framework для предотвращения блокировок записей

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

Вопрос:

Кто какой механизм использует для предотвращения обновления одной записи в одной транзакци по два раза по два раза?
(я понимаю, что Гугл в помощь, но мне ж интересно мнение товарищей, которые уже используют что-то и недостатки тех механизмов)

Наступил такой момент, когда вроде все красиво вызывается из разных триггеров разных объектов, обновление записей делаю только один раз в конце всех вычислений. Но периодически я вижу ошибку "UNABLE_TO_LOCK_ROW". Я понимаю, почему это происходит (первый триггер вызвал обновление записи А, второй триггер, который был вызван из первого вызывает обновление той же записи А (но, другое поле)).  
  
Вопрос:  
  
Кто какой механизм использует для предотвращения обновления одной записи в одной транзакци по два раза по два раза?  
(я понимаю, что Гугл в помощь, но мне ж интересно мнение товарищей, которые уже используют что-то и недостатки тех механизмов)

Хм... Как-то быстрый поиск ничего не дал.

Как я себе представляю этот механизм:
1) Есть общее хранилище (Map<Id, sObject> objectsToUpdate) для записей одинакового типа на обновление. Все триггеры скидывают туда свои записи для обновления.
2) И вот в конце всех триггеров происходит update objectsToUpdate.values().

Хм... Как-то быстрый поиск ничего не дал.  

Как я себе представляю этот механизм:
1) Есть общее хранилище (Map<Id, sObject> objectsToUpdate) для записей одинакового типа на обновление. Все триггеры скидывают туда свои записи для обновления.
2) И вот в конце всех триггеров происходит update objectsToUpdate.values().

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

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

Точно!
У меня пара методов вызывается асинхронно и вот они-то и пытаются обновить одну и туже запись.
Попробовать заблокировать запись (FOR UPDATE в SOQL) и если не удается, то запустить код с помощью scheduled job на через минутку?
Можно scheduled job запустить из future метода? Можно.

Точно!
У меня пара методов вызывается асинхронно и вот они-то и пытаются обновить одну и туже запись.
Попробовать заблокировать запись (FOR UPDATE в SOQL) и если не удается, то запустить код с помощью scheduled job на через минутку?  
Можно scheduled job запустить из future метода? Можно.

да, еще можно попробовать оптимизировать сами записи. Эта ошибка лезет когда на один аккаунт много чего вешаешь (типа default account) и там 100500 шарингов обновляется или еще какой parent и множество детей. На обычной записи такое редко возникает

FOR UPDATE должен вроде как 10 сек ждать пока ресурс освободится, если не дождется то упадет

да, еще можно попробовать оптимизировать сами записи. Эта ошибка лезет когда на один аккаунт много чего вешаешь (типа default account) и там 100500 шарингов обновляется или еще какой parent и множество детей. На обычной записи такое редко возникает

FOR UPDATE должен вроде как 10 сек ждать пока ресурс освободится, если не дождется то упадет

Ага, Account родимый с Contacts :-)

Ага, Account родимый с Contacts :-)
У вас ответ в вопросе
https://github.com/kevinohara80/sfdc-trigger-framework#max-loop-count