Ofbiz 事务详解



大家都知道Java中的事务分为:本地事务和全局事务。


何为本地事务,因为Java本身通过JDBC进行数据库操作是没有事务的,也就是自动进行提交。而本地事务就是在connection连接里面设置了setAutoCommit(false),手工打开JDBC事务,然后在该connection上所做的所有操作都能保证ACID属性;

而对于Java的全局事务,说穿了就是采用JTA Java Transacion API)的事务,该事务不依赖于具体的连接(因为它甚至可以是JMS资源),如果全局事务中包含了多个资源,那么它采用的就是所谓的“两阶段提交”规则,从而也保证了事务的ACID属性。

  

前面是对Java中的事务进行了一个概括性的总结?

而对于我们最熟悉的ofbiz框架中的几个事务性问题应该如何解答:


1  ofbiz框架中的服务可以通过配置文件进行启用和关闭事务,那么ofbiz服务中如果不开启事务,只要我们在调用服务前用TransactinUtil.begin()显式的打开事务,那么一样可以保证事务的一致性,关于这一点通过查看调用服务的ofbiz原码即可得到,这样不在赘述。

2  ofbiz框架中如果调用两次连接更新不同的对象,那么通过在调用前启用TransactionUtil.begin();是不是能够保证事务的一致性呢?

3  Ofbiz框架中如果在一个TransactionUtil.begin()事务中,既更新了一个数据连接的表,同时通过取得另外的数据连接执行了存储过程的调用,那么这两者能否保持同步?

4  如果在一个TransactionUtil.begin()事务中,连接了两个不同的数据源,更新第二个数据源时发生异常,能否保证数据的一致性?  

通过查看TransactionUtil.begin()代码跟踪下去,看了一下Tyrex组件对于全局性事务的解析,我们预计:由于Tyrex组件在commit()如果检测到多个资源,而这多个资源都满足XA协议,那么它会采用“两阶段提交”方式,故我们预期上面几个情况均能保证事务的一致性。

 通过几个简单的实验证明,上述预期是完全正确的。 核心代码如下:

 

public static String CustomerGatherMethodCreate(HttpServletRequest 

request,

                          HttpServletResponse response) {

                  boolean isSave = false; 

               List toBeStore = new ArrayList();   

                  boolean beganTrans = true; 

               GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator"); 

               try {    

                   if (beganTrans)     

                                    beganTrans = TransactionUtil.begin(); 

                    List tempList = delegator.findByAnd(      

                    "RelationshipAttribute", UtilMisc.toMap(        

                            "roleTypeIdFrom", "DISTRIBUTOR",        

                            "roleTypeIdTo", "MANUFACTURER", 

                            "partyIdFrom", "DKHTV.DRFGL", "partyIdTo",        

                                               "01", "attrName",     

                                         "GATHER_FEATURE")); 

                       GenericValue gv = null; 

                       Iterator iter=tempList.iterator();    

                          if(iter.hasNext())     

                                    gv = (GenericValue)iter.next(); 

                       gv.set("attrValue", "NOGATHER");    

                          toBeStore.add(gv);  

                         delegator.storeAll(toBeStore); 

//                      isSave = saveCustomerGatherMethod("abc","3", delegator); 
                       testTulipTransaction(); 

                       TransactionUtil.commit(beganTrans); 

                          request.setAttribute(SiteDefs.EVENT_MESSAGE, "成功更改客户采集方式!"); 

                          return "success"; 

               } catch (Exception e) {    

                          e.printStackTrace();    

                          Debug.logError(e);    

                          try {     

                                   TransactionUtil.rollback(beganTrans); 

                       } catch (GenericTransactionException e1) {     

                                   e1.printStackTrace(); 

                       } 

         request.setAttribute(SiteDefs.ERROR_MESSAGE,e.getMessage()+",更改客户采集方式失败,事务回滚!"); 

                       return "error"; 

} 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值