|
|
#1 |
|
Участник
|
Простой код, но UpdateConflict, почему?
Мне попался код, который очень простой и не кажется ошибочным на первый взгляд, но он выдавал updateConflict. Я хочу лучше понять механику процесса, буду благодарна объяснению
X++: ttsbegin while select forupdate purchline where purchid = 'MyCurrentPONumber' { ... if (some condition) { ttsbegin; purchline.FieldA = 'aa'; purchline.update(); ttscommit; } } ttscommit Я также понимаю, что этот update(в versioning) меняет recversion и ,соответственно, он уже не тот на линиях, что был выбран в "while select forupdate purchline" Но я тогда не понимаю, 1) как можно в одной транйакции(то есть, либо все проапдейчены линии, либо нет) сделать апдейт в всех линий какого-нибудь одного заказа за закупку? Это же типичный сценарий, но versioning может его сломать... 2) есть ли в коде выше какие-то очевидные ошибки (если бы вы не знали, что там проблема есть). вроде, классика делать ttsbegin while select forupdate purchline where purchid = 'MyCurrentPONumber' { purchline.update(); } ttscommit 3)Ну, и вообще, это же одна транзакция тут (внешняя, что до while select), то есть lock должен защищать от одновременного апдейста разными транцакциями. В рамках одной все должно быть ок, разве нет? Последний раз редактировалось Lankey; 07.01.2026 в 22:19. |
|
|
|
|
|