创建许多批次(系统操作框架)非常快速地执行类似的过程 - "Cannot edit a record in LastValue (SysLastValue)"?



我有一个SysOperation框架进程,它创建一个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表

你知道是怎么回事吗?

我也经常遇到这种异常,所以我在我的服务操作中创建了捕获DuplicateKeyException的习惯。当它被抛出时,捕获它并重试(默认值为5倍)。当许多进程同时运行时,就会发生错误,就像您现在所做的那样。

DupplicateKeyException可以在事务中被捕获,所以如果你能找到SysLastValue表中的代码,你可以通过在代码周围放置一个try/catch来改进。

据我所知,这些是唯一出现在该表中插入记录的情况(可能在内核中除外):

  • InventUnusedDimCleanUp.serialize()
  • SysAutoSemaphore.autoSemaphore()

在那里放置一个断点,看看代码是否被执行。如果是这样,您可以添加retry的try/catch,看看是否"修复"它。

您还可以使用跟踪座舱和跟踪解析器来找出插入记录的位置,如果它不是这两个之一的话。

我关于LoadFromSysLastValue的理论:我认为设置this.parmLoadFromSysLastValue(false)不起作用,因为它只在对话框启动时考虑,而不是在执行操作时考虑。在批处理时,不会使用SysLastValue来初始化您的数据契约,因为您希望它使用您在数据契约中提供的确切参数。

这是因为在批处理中调用SysOperationController.savelast()的代码,我的解决方案是在SysOperationController.loadFromSysLastValue()中将loadFromSysLastValue设置为false,作为批处理检查的一部分:

if (!this.isInBatch())
{
    .....
}
//Begin
else
{
    loadFromSysLastValue = false;
}
//End

最新更新