13.04.2017, 16:22 | #1 |
Участник
|
Inclusion in database transactions
Всем привет!
Есть проблемы в плане области видимости рекордов. Речь идет о создании записи и плагине Post-operation (execution mode == sync). Насколько я понимаю, то данные в CRM и логика работы плагинов должна быть построенна исходя из уровня изолированости read committed. То есть если у меня плагин и он последний в плане Execution Order, и в нем происходит ексепшен, то транзакция не была/не должна быть закомиченна полностью и происходит rollback. И по сути этот рекорд не должен быть visible из вне - так по крайней мере говорит мне логика что dirty reads не должно быть. Но по-факту, у нас другая ситуация - и рекорд можно считать использую xrm (без NoLock = true). Мне от интересно сама природа плагина играет в этом процессе роль: вызов SOAP сервиса и эксепшен в нем могут спровоцировать такую странную реакцию платформы при условии что все происходит синхронно? Просто я не понимаю где гарантии? Цитата:
If a plug-in is executing in the database transaction and allows an exception to be passed back to the platform, the entire transaction will be rolled back. Stages 20 and 40 are guaranteed to be part of the database transaction
MS утверджает, что Цитата:
Any registered plug-in that executes during the database transaction and that passes an exception back to the platform cancels the core operation. This results in a rollback of the core operation. In addition, any pre-event or post event registered plug-ins that have not yet executed and any workflow that is triggered by the same event that the plug-in was registered for will not execute.
Последний раз редактировалось Ion; 13.04.2017 в 16:25. |
|
13.04.2017, 20:27 | #2 |
Moderator
|
Увы, я не смог проследить вашу мысль. Вся воронка обработки, действительно, выполняется в транзакции. Увы, не могу с уверенностью утверждать, создаются ли дочерние транзакции под каждый плагин, или дочернее событие, но с уверенностью могу сказать, что каждый последующий плагин видит изменения, которые были внесены предыдущими. И это, имхо, правильно. Если вам нужно видеть исходные, не измененные данные, вы можете использовать механизм Image
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
14.04.2017, 07:38 | #3 |
Участник
|
Если речь идет именно о плагинах на Post, то вполне логично, что исключения в них не ведут к откату транзакции, а также логично, что в вашем плагине видны все изменения предыдущих плагинов. Ведь Post-плагины выполняются, когда данные уже сохранены в базу, транзакция закончилась и отменить эти изменения в плагине нельзя - поздняк метаться
|
|
14.04.2017, 08:03 | #4 |
Moderator
|
Коллега, вы в корне не правы. Начиная с 2011 все синхронные плагины, и пре и пост, выполняются внутри одной транзакции. Ошибка на пост событии так же ведет к откату транзакции, несмотря на то, что данные уже были записаны в базу. На самом деле, они, к этому моменту были записаны только в лог транзакции, но не суть.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
14.04.2017, 08:43 | #5 |
Участник
|
Да, чет фигню сморозил
А вот ваше замечание о том, что данные записываются в лог транзакции - это не ответ на вопрос почему они доступны для считывания? |
|
14.04.2017, 10:21 | #6 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Увы, я не смог проследить вашу мысль. Вся воронка обработки, действительно, выполняется в транзакции. Увы, не могу с уверенностью утверждать, создаются ли дочерние транзакции под каждый плагин, или дочернее событие, но с уверенностью могу сказать, что каждый последующий плагин видит изменения, которые были внесены предыдущими. И это, имхо, правильно. Если вам нужно видеть исходные, не измененные данные, вы можете использовать механизм Image
Но в это же самое время другая система делает кол через XRM API, и говорит: - А дай-ка мне последние созданные заказы. И мне неясно почему этот заказ стал видим если в последнем плагине произошел эксепшен и он откатился? У нас же read commited, почему присутствует грязное чтение? Мы можем его стабильно воспроизвести. Написали две тулы: первая - пишет данные в СРМ с прекондишеном, что в плагине будет эксепшен; вторая - как консолька мониторит новосозданные рекорды и забирает их к себе в систему. От и весь сценарий, в систему попадают ИД заказов которых нет. В той системе формируеться урл на рекорд из СРМ. Узер открывает запись, а ее в системе нет. Последний раз редактировалось Ion; 14.04.2017 в 10:24. |
|
17.04.2017, 22:11 | #7 |
Moderator
|
Они доступны только внутри той же транзакции, все логично. Если вы остановите плагин отладчиком и посмотрите на данные через интерфейс, вы увидите не измененные данные.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.04.2017, 22:18 | #8 |
Moderator
|
Ни разу не встречал подобное. Технически, грязное чтение можно разрешить, но по дефолту оно выключено: https://community.dynamics.com/crm/b...nd-dirty-reads
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.04.2017, 22:32 | #9 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Ни разу не встречал подобное. Технически, грязное чтение можно разрешить, но по дефолту оно выключено: https://community.dynamics.com/crm/b...nd-dirty-reads
Приходиться только развести руками, потому что идей как это решить нет. |
|
17.04.2017, 22:54 | #10 |
Чайный пьяница
|
Проблема решается примитивно просто (как по мне). Делаете дополнительную таблицу, в поспроцессинге пишете туда идентификатор новой записи. В своём сервисе перед тем, как спрошать эндпоинт - получаете идентификатор из таблицы. Никаких проблем вроде.
Понимаю, что доп прослойка, но зато вы получаете только актуальные данные. Я так в своё время писал интеграцию с 1С.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
18.04.2017, 11:29 | #11 |
Участник
|
Цитата:
Сообщение от a33ik
Проблема решается примитивно просто (как по мне). Делаете дополнительную таблицу, в поспроцессинге пишете туда идентификатор новой записи. В своём сервисе перед тем, как спрошать эндпоинт - получаете идентификатор из таблицы. Никаких проблем вроде.
Понимаю, что доп прослойка, но зато вы получаете только актуальные данные. Я так в своё время писал интеграцию с 1С. |
|
18.04.2017, 16:34 | #12 |
Чайный пьяница
|
Открытие сапорт тикетов в МС в особенности если у вас онпрем - сейчас гиблое дело. Я уже сталкивался. Даже премиум сапорт зачастую не решает тикеты.
Так что, боюсь, придётся вам решать проблему через доппрослойки...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
19.04.2017, 11:17 | #13 |
Участник
|
Єх, спасибо за ворк єраунд. Думаю так и сделаю если вариантов негусто
|
|
|
|