红鱼儿

kbmMW 存储过程与RunInTransaction

同事写了一个存储过程,用来计算库存表,数据库是sql server,然后利用kbmMWClientStoreProc来调用。因为在存储过程中使用了事务,当库存不足时,Rollback事务并提升级异常,这时候,产生个错误,大意是事务不配对。

跟踪代码,发现当客户端kbmMWClientStoreProc调用存储过程,转到服务端后,由查询服务(QueryService)来处理,而查询服务又是利用其属性StoreProc指定的对象来执行存储过程,对于我来说,用的是kbmMWuniDACStoreProc控件。

现在我们把焦点放到kbmMWuniDACStoreProc上,他有一个属性RunInTransaction,默认为True,再查看代码,当为True时,kbmMWuniDACStoreProc执行存储过程时会自动开启事务,发生异常回滚事务,正常执行则提交事务。为False时,则在执行存储过程时,不用事务。

正因如此,kbmMWuniDACStoreProc开启了事务,而在存储过程中又开启了事务,造成出错了,按理说,事务都是配对的,也不应该出错。用的sql server 2008,可能是这个原因,sqlserver 2008不支持吧,没有进一步查证。

现在把RunInTransaction设置为False,再执行,问题解决,换一种方法,RunInTransaction依旧为True,在存储过程中去掉了事务,只是提升异常,问题也解决。

如果在客户端的kbmMWClientStoreProc组件能有个属性来指定是否在服务端开启事务就好了!可惜没有查到。

posted on 2020-11-24 08:50  红鱼儿  阅读(311)  评论(0编辑  收藏  举报