08.12.2020, 16:06 | #1 |
Участник
|
ax2012: UnitOfWork.getByKey(): а как получить запись forUpdate?
UnitOfWork.getByKey(record): а как получить запись в режиме forUpdate?
если getByKey возвращает true, то в record содержится запись. Но record.selectForUpdate() у меня всегда возвращает false. Как сделать так, чтобы полученную из getByKey можно было обновить методом update, не выполняя повторного поиска. Я правильно понимаю, что начав использовать UnitOfWork, мы должны использовать только его? Ну, или выполнять повторный поиск в базе? |
|
08.12.2020, 18:22 | #2 |
Участник
|
Цитата:
Сообщение от mazzy
...Но record.selectForUpdate() у меня всегда возвращает false.
Как сделать так, чтобы полученную из getByKey можно было обновить методом update, не выполняя повторного поиска. Я правильно понимаю, что начав использовать UnitOfWork, мы должны использовать только его? Ну, или выполнять повторный поиск в базе? \Classes\InventCostItemDim\updateInventTrans X++: protected void updateInventTrans(InventTrans _inventTrans) { if (_inventTrans.RecId) { _inventTrans.skipTTSCheck(true); // !!! this.updateCostAmountStd(_inventTrans); _inventTrans.update(); // !!! } this.updateInventTransMap(_inventTrans); } Хотя возможно для UnitOfWork возможен другой подход. |
|
08.12.2020, 19:34 | #3 |
Участник
|
Не.
В мапе хранится ссылка на исходный объект, который был получен обычными поиском с forUpdate. А вот getByKey() сам выполняет поиск. причем, похоже без указания forupdate (или я чего-то не понимаю) Про ссылки: Что передается функциям, ссылки или значения? Что хранит map ? ссылки на Record или сам рекорд в упакованном виде ? https://www.youtube.com/watch?v=nmoB6dzJC7o Последний раз редактировалось mazzy; 08.12.2020 в 19:44. |
|
08.12.2020, 20:17 | #4 |
Участник
|
Набросал небольшое исследование.
В общем из мапа достается равная копия буфера несвязанная с курсором. Хотя почему-то в моем случае она обновилась и без skipTtsCheck Неожиданно. X++: static void testBuffer(Args _args) { // RecId recId = 5637144576; InventTable inventTable; InventTable inventTable2; Map map = new Map(Types::Int64, Types::Record); ; // inventTable.disableCache(true); ttsBegin; // inventTable = InventTable::findRecId(recId, curExt2dataareaid(tableNum(InventTable)), true); select forupdate inventTable order by RecId; info(strFmt("до помещения в мап inventTable.usageCount() = %1", inventTable.usageCount())); info(strFmt("recId = %1, forUpdate = %2", inventTable.RecId, inventTable.selectForUpdate())); // выдаст true map.insert(inventTable.RecId, inventTable); info(strFmt("после помещения в мап inventTable.usageCount() = %1", inventTable.usageCount())); inventTable2 = map.lookup(inventTable.RecId); info(strFmt("Достали из мапа recId = %1, forUpdate = %2", inventTable2.RecId, inventTable2.selectForUpdate())); // выдаст false if (inventTable2.equal(inventTable)) { info(strFmt("Буфер извлеченный из БД и из мапа РАВНЫ. inventTable.usageCount() = %1, inventTable2.usageCount() = %2", inventTable.usageCount(), inventTable2.usageCount())); } else { info(strFmt("Буфер извлеченный из БД и из мапа НЕ равны.inventTable.usageCount() = %1, inventTable2.usageCount() = %2", inventTable.usageCount(), inventTable2.usageCount())); } inventTable.RecId++; if (inventTable2.RecId == inventTable.RecId) { info("в памяти это один и тот же объект"); } else { info("в памяти это разные объекты"); } // а что с курсором ? try { next inventTable; info(strFmt("С буфером извлеченным из базы связан курсор и можно выполнить next. - Извлечена следующая запись с RecId = %1", inventTable.RecId)); } catch { info(strFmt("С буфером извлеченным из базы уже НЕ связан курсор (и это странно) RecId = %1", inventTable.RecId)); } /* // если раскомментить код то будет ошибка времени выполнения что говорит о том что курсор уже не связан с inventTable2 т.е. мы работали с копией try { next inventTable2; info(strFmt("С буфером извлеченным из базы связан курсор и можно выполнить next. - Извлечена следующая запись с RecId = %1", inventTable2.RecId)); } catch { info(strFmt("С буфером извлеченным из базы уже НЕ связан курсор (и это странно) RecId = %1", inventTable2.RecId)); } */ info(strFmt("RecId = %3. inventTable.BOMLevel до обновления = %1. forupdate = %2", inventTable.BOMLevel, inventTable.selectForUpdate(), inventTable.RecId)); inventTable.BOMLevel++; inventTable.doUpdate(); inventTable.reread(); info(strFmt("inventTable.BOMLevel после обновления = %1", inventTable.BOMLevel)); info(strFmt("RecId = %3. inventTable2.BOMLevel до обновления = %1. forupdate = %2", inventTable2.BOMLevel, inventTable2.selectForUpdate(), inventTable2.RecId)); inventTable2.BOMLevel++; inventTable2.doUpdate(); inventTable2.reread(); info(strFmt("inventTable2.BOMLevel после обновления = %1", inventTable2.BOMLevel, inventTable.RecId)); // оказалось что skipTtsCheck уже не нужен ttsCommit; } |
|
|
За это сообщение автора поблагодарили: mazzy (15), SHiSHok (4). |