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

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<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.

}

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容