SAP B1 DI开发中 "事务" 的使用注意事项

SAP,SBO,SAPB1,DI,报错,二次开发。

--------------------

前往:http://www.blenderkou.top/contents/10/3211.html

获取更好的阅读体验。

---------------------

概念

SAP B1 DI 全局事务:在“全局事务”中,你能执行很多步对象操作,如果某一步的操作失败,那么整个事务的所有对象操作将自动地被迫回滚。使用“全局事务”时,数据库隔离级别保持在最高级别。这意味着所有资源(表,索引,视图等)都将具有独占锁,并且将被其他事务的任何操作阻止。

如:同时生成销售订单和采购订单,有任意一个失败则两个单据都无法添加。

要求

1、必须使用Company对象的StartTransaction EndTransaction指定事务的开始和结束。

必须将参数传递给EndTransactionendType为SAPBobsCom.BoWfTransOpt),以指示是否要提交或回滚此事务中包含的更改。

2、官方始终建议在“全局事务”下保持逻辑更少的时间消耗。

3、如果已经在“全局事务”内部启动了DI API方法,则不要使用UI API方法。

4、如果您确实需要运行复杂的耗时逻辑,请安排在非生产时间。

5、确保涉及“全局事务”的处理逻辑中没有等待用户输入的操作。

6、不要对“全局事务”使用多线程编程,这将导致数据不一致。

7、除非必要,否则不要使用“全局事务”。


问题

当您使用DIAPI时,使用 全局事务start transaction 和end transaction 来处理高并发环境中的操作,有时可能会发生数据库死锁。

处理方法

发生死锁时(错误代码-2038),加载项应捕获异常并重试。在大多数情况下,您可以通过重试操作或事务来解决死锁。

以下程序是死锁处理的示例:

mainFunc()

{

const long DEADLOCK_ERR_CODE = -2038;

long DeadlockTryTime = 5;

long i =0;

int retCode = 0;

for (i=0; i

{

try

{

company.StartTransaction();

retCode = DoOperations();

 if (retCode == success)

{

company.EndTransaction(SAPbobsCOM.BoWfTransOpt.wf_Commit);

break;

}

else if (retCode == DEADLOCK_ERR_CODE)

{

//error code returned by DI object operations

continue;

}

else

{

//other error handling

}

}

catch (System.Runtime.InteropServices.COMException ex)

{

//exception thrown from DI service operations

if (ex.ErrorCode == DEADLOCK_ERR_CODE)

{

continue;

}

else

{

//other exception handling

}

        }

}

if (i == DealockTryTime)

{

//return error, throw deadlock exception, or other error handling

}

}

int DoOperations()

{

//Your logic to perform BO operations.

}

                                     扫描二维码,关注我的公众号,第一时间获取文章!

你可能感兴趣的:(SAP B1 DI开发中 "事务" 的使用注意事项)