SAP,SBO,SAPB1,DI,报错,二次开发。
--------------------
前往:http://www.blenderkou.top/contents/10/3211.html
获取更好的阅读体验。
---------------------
概念
SAP B1 DI 全局事务:在“全局事务”中,你能执行很多步对象操作,如果某一步的操作失败,那么整个事务的所有对象操作将自动地被迫回滚。使用“全局事务”时,数据库隔离级别保持在最高级别。这意味着所有资源(表,索引,视图等)都将具有独占锁,并且将被其他事务的任何操作阻止。
如:同时生成销售订单和采购订单,有任意一个失败则两个单据都无法添加。
要求
1、必须使用Company对象的StartTransaction 和EndTransaction指定事务的开始和结束。
必须将参数传递给EndTransaction(endType为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.
}
扫描二维码,关注我的公众号,第一时间获取文章!