При создании множества пакетов (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
Другие вопросы по тегам