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

BlenderKou 阅读量:220 2019-03-30 SAP B1 DI开发中 SAPB1 二次开发

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


概念

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<DeadlockTryTime; 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.
}


微信公众号.jpg

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

上一篇
如何在轻量级部署中打包和部署 SAP Business One扩展插件

下一篇
用 SAP HANA 和 ADO.NET 创建 一个 C# 程序