Для карсоты решения

еще раз приведу утверждения
1 С чего все началось:
X++:
ttsbegin;
WHILE(TRUE)
{
SELECT FIRSTONLY current WHERE current.InvGuid == InvGUID;
InvGUID = current.ParentInvGUID;
SELECT FIRSTONLY parent WHERE current.ParentInvGUID == parent.InvGUID;
if(parent)
{
//parentDistr.disableCache();
SELECT FIRSTONLY
FORUPDATE parentDistr
WHERE parentDistr.InvGUID == InvGUID &&
parentDistr.TransRecId == inventoryGuidInvoice.TransRecId
//...........
&& parentDistr.JuridicalPersonId == inventoryGuidInvoice.JuridicalPersonId;
if(parentDistr)
{
parentDistr.AMOUNTCUR += inventoryGuidInvoice.AmountCur;//слияние к предку
//.......
parentDistr.Update();
}
else
{
parentDistr.data(InventoryGuidInvoice);
parentDistr.InvGUID = parent.InvGUID;
parentDistr.insert();
}
}
else
{
break;
}
current.clear();
}
ttscommit;
2 Моя формулировка
X++:
while select
{
ttsbegin;
select forupdate
ttscommit;
}
3 Что гласит документация :
X++:
DO NOT: Hold database locks for longer than is necessary.
DO: Limit the transaction scope by grabbing locks at the latest possible time and
releasing locks as early as possible.
4 Не корректный код, читай в п1
X++:
ttsBegin;
while select ItemId
from salesLine
{
select firstOnly forUpdate ItemType, ItemBuyerGroupId
from inventTable
where inventTable.ItemId == salesLine.ItemId;
If (inventTable && (inventTable.ItemType == InventItemType::Item))
{
inventTable.ItemBuyerGroupId = ;
inventTable.update();
}
}
ttsCommit;
5 Корректный код
X++:
while select ItemId
from salesLine
{
select firstOnly forUpdate ItemType, ItemBuyerGroupId
from inventTable
where inventTable.ItemId == salesLine.ItemId;
If (inventTable && (inventTable.ItemType == InventItemType::Item))
{
ttsBegin;
inventTable.ItemBuyerGroupId = ;
inventTable.update();
ttsCommit;
}
}