Spring-JDBC/ORM 统一事物管理解决方案
?参加Spring源码:
?
SessionFactory org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory() throws Exception?
第三种:使用被代理的数据源:
?
使用 TransactionAwareDataSourceProxy
如果不得已要显式获取数据连接,除了使用 DataSourceUtils 获取事务上下文绑定的连接外,还可以通过 TransactionAwareDataSourceProxy 对数据源进行代理。数据源对象被代理后就具有了事务上下文感知的能力,通过代理数据源的 getConnection() 方法获取的连接和使用 DataSourceUtils.getConnection() 获取连接的效果是一样的。
下面是使用 TransactionAwareDataSourceProxy 对数据源进行代理的配置:
public void setDataSource(DataSource dataSource) { if(dataSource instanceof TransactionAwareDataSourceProxy) this.dataSource = ((TransactionAwareDataSourceProxy)dataSource).getTargetDataSource(); else this.dataSource = dataSource; }
清单 11.applicationContext.xml:对数据源进行代理?
及:?void org.springframework.orm.jpa.JpaTransactionManager.setDataSource(DataSource dataSource)
?
对于 Hibernate 的?sessionFactory?取得的所有的实际数据库连接皆取自于?
Connection?org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourcedataSource) throws?SQLException
?
而就是这个方法保证了取得的数据库连接 是 绑定到当前线程的真正数据库连接.
?
对于MyBatis官方文档中就是 使用 JDBC事务管理器便能够管理事务,则
?
只要 数据库被代理了,且使用的是 JDBC事务管理器则能够保证事务的一致性,
?
?
?另参见Hibernate配置:void org.springframework.orm.hibernate3.AbstractSessionFactoryBean.setUseTransactionAwareDataSource(boolean useTransactionAwareDataSource)
和?http://www.blogjava.net/i369/articles/194855.html
但JPA事务管理器取得的数据库连接也是?DataSourceUtils.doGetConnection 取得的连接