Hibernate與JDBC事物的混用
最近摸索了一下Hibernate與JDBC(iBATIS)事務整合問題,算是有點收穫,寫出來和大家討論一下吧。。。
一般大家都會使用Spring宣告型事務 transactionAttributes 為 PROPAGATION_REQUIRED
Hibernate 使用 HibernateTransactionManager 、JDBC(iBATIS) 使用DataSourceTransactionManager
當需要將它們整合到一個事務中的時候
普通的做法是配置統一的DataSource, Hibernate與JDBC(iBATIS) 都使用HibernateTransactionManager
------------------------------------------------------
Hibernate與JDBC(iBATIS) 都使用DataSourceTransactionManager又可不可以呢?
普遍的看法是 NO! 認為DataSourceTransactionManager根本就不處理Hibernate的session,事務當然無法實現。。。
但事實是否真的如此呢?
Juergen Hoeller:
Just if you proxy your JDBC DataSource with a TransactionAwareDataSourceProxy (available since Spring 1.1 RC1) and pass that proxy to your LocalSessionFactoryBean, you could use DataSourceTransactionManager in combination with Hibernate.
也就是說配置 sessionFactory 的 useTransactionAwareDataSource 為 true
Hibernate與JDBC(iBATIS) 都使用 DataSourceTransactionManager 同樣可以保證事務
原理就是保證了 connection 的唯一性。