Warm tip: This article is reproduced from serverfault.com, please click

Creating many batches (SysOperation Framework) very quickly doing similar processes

发布于 2014-07-15 18:43:03

I have a SysOperation Framework process that creates a ReliableAsynchronous batch to post packing slips and several get created at a time.

Depending on how quickly I click to create them, I get: 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.

And

Cannot create a record in LastValue (SysLastValue). User ID: t edit a, Class. The record already exists.

On a couple of them in the BatchHistory. I have this.parmLoadFromSysLastValue(false); set. I'm not sure how to prevent writing to SysLastValue table.

Any idea what could be going on?

Questioner
Alex Kwitny
Viewed
0
Klaas Deforche 2014-07-16 18:10:57

I get this exception a lot too, so I've created the habit of catching DuplicateKeyException in my service operation. When it is thrown, catch it and retry (for a default of 5x). The error occurs when a lot of processes run simultaneously, like you are doing now.

DupplicateKeyException can be caught inside a transaction so you could improve by putting a try/catch around the code that does the insert in the SysLastValue table if you can find the code.

As far as I can see these are the only to occurrences where a record is inserted in this table (except maybe in kernel):

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

Put a breakpoint there and see if that code is executed. If so you can add a try/catch with retry and see if that "fixes" it.

You could also use the tracing cockpit and the trace parser to figure out where that record is inserted if it's not one of those two.

My theory about LoadFromSysLastValue: I believe setting this.parmLoadFromSysLastValue(false) does not work since it is only taken into account when the dialog is started, not when your operation is executed. When in batch, no SysLastValue will be used to initialize your data contract as you want it to use the exact parameters you have supplied in your data contract .