Ofbiz 事务详解
2015-11-14 02:38
337 查看
大家都知道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协议,那么它会采用“两阶段提交”方式,故我们预期上面几个情况均能保证事务的一致性。
通过几个简单的实验证明,上述预期是完全正确的。
核心代码如下:
大家都知道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"; }
相关文章推荐
- Leetcode Range Sum Query - Immutable
- NYOJ 1058 部分和问题(dfs)
- 【Alpha】Daily Scrum Meeting总结
- linux编译内核make menuconfig报错解决办法
- [个人博客作业Week7]软件工程团队项目感想与反思
- struct打包模块加强版!支持任意长度字符串解包
- Leetcode Swap Nodes in Pairs
- 使用nvm做nodejs的版本管理
- Android仿QQ实现ListView滑动删除
- struts2核心工作流程与原理
- 个人阅读作业Week7
- 大二生活最近生活总结
- Android动态显示和隐藏状态栏
- HDU 3652 B-number
- HDU 3652 B-number
- java的真相
- 《项目百态》深入理解软件项目行为模式 读后有感触的模式
- Windows下git web hook免除密码输入的烦人事(SSH和HTTPS)
- 黑马程序员_JavaSE基础知识总结十五:反射
- 自己做的demo---宣告可以在java世界开始自由了