Spring + Hibernate + JOTM 分布式事务配置
多数据源情况下的事务管理,适用于部署到非应用服务器的Web应用和Standalone的应用程序
?
1. 环境
? ? Spring + Hibernate + JOTM, Oracle Database
?
2. 场景用例
? ? 两个数据库分别存储User信息和Address信息
?
3. 代码及配置
?
? ? 1) carol.properties
#JNDI调用协议
? ? ? ? carol.protocols=jrmp
? ? ? ? #不使用CAROL JNDI封装器
? ? ? ? carol.start.jndi=false
? ? ? ? #不启动命名服务器
? ? ? ? carol.start.ns=false
?
?
? ? 2) 简单的DAO层实现
?
?
?
以上代码已经过测试可以实现分布式事务管理。 为了对比,曾试过使用BasicDataSource且不使用JOTM,使用org.springframework.orm.hibernate3.HibernateTransactionManager管理多数据源情况下的事务,开始时看到异常情况下也可以同时回滚,但是后来发现是Hibernate缓存造成的假象,原因是:默认情况下,Hibernate 要在事务提交时才将数据的更改同步到数据库中,而事务提交发生在业务方法返回前,如果有异常,方法没有正常返回,User信息没有被同步到数据库而不是被回滚掉。这时需要调用 flush() 方法将数据更改同步到数据库才能比较出两种情况下的不同。