При создании множества пакетов (SysOperation Framework) очень быстро выполняются похожие процессы: "Не удается отредактировать запись в LastValue (SysLastValue)"?
У меня есть процесс SysOperation Framework, который создает пакет ReliableAsynchronous для публикации упаковочных листов, и несколько из них создаются одновременно.
В зависимости от того, как быстро я нажимаю, чтобы создать их, я получаю:Cannot edit a record in LastValue (SysLastValue).
An update conflict occurred due to another user process deleting the record or changing one or more fields in the record.
А также
Cannot create a record in LastValue (SysLastValue). User ID: t edit a, Class.
The record already exists.
На пару из них в BatchHistory. я имею this.parmLoadFromSysLastValue(false);
задавать. Я не уверен, как предотвратить запись в таблицу SysLastValue.
Есть идеи, что может происходить?
2 ответа
Я тоже получаю это исключение, поэтому у меня появилась привычка ловить DuplicateKeyException
в моей сервисной эксплуатации. Когда он брошен, поймайте его и повторите попытку (по умолчанию 5x). Ошибка возникает, когда одновременно выполняется много процессов, как вы делаете сейчас.
DupplicateKeyException
может быть пойман внутри транзакции, чтобы вы могли улучшить, поместив try/catch вокруг кода, который выполняет вставку в SysLastValue
таблица, если вы можете найти код.
Насколько я вижу, это единственные случаи, когда запись вставляется в эту таблицу (за исключением, может быть, в ядре):
InventUnusedDimCleanUp.serialize()
SysAutoSemaphore.autoSemaphore()
Установите точку останова и посмотрите, выполняется ли этот код. Если это так, вы можете добавить попробовать / поймать с retry
и посмотрим, исправит ли это это.
Вы также можете использовать кабину трассировки и анализатор трассировки, чтобы выяснить, куда вставляется эта запись, если она не одна из этих двух.
Моя теория о LoadFromSysLastValue: я верю настройке this.parmLoadFromSysLastValue(false)
не работает, поскольку учитывается только при запуске диалога, а не при выполнении вашей операции. В пакетном режиме SysLastValue не будет использоваться для инициализации вашего контракта на данные, поскольку вы хотите, чтобы он использовал точные параметры, которые вы указали в вашем контракте на данные.
Это из-за кода, вызывающего SysOperationController.savelast() в пакетном режиме, мое решение - установить для loadFromSysLastValue значение false в SysOperationController.loadFromSysLastValue () как часть пакетной проверки:
if (!this.isInBatch())
{
.....
}
//Begin
else
{
loadFromSysLastValue = false;
}
//End