![]() |
#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). |