由於項目中既用到了Hibernate,又用到了Mybatis,還用到了JdbcTemplate,比較糾結於他們的事務,抽了個時間好好研究了下,有理解不正確的地方,歡迎批評指正
大致的來說,事務可以分爲以下2中:
1.JDBC的事務
2.JTA,容器的事務
由於不涉及到JTA,就不談JTA的事務了
TransactionManager用的是HibernateTransactionManager,大概配置如下:
1
2
3
4
5
6
|
< bean
id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager" > < property
name = "sessionFactory" > < ref
bean = "sessionFactory"
/> </ property > </ bean > |
配置的事務是在service.impl層的,配置大概如下
1
2
3
4
5
|
< aop:config > < aop:pointcut
id = "allManagerMethod" expression = "execution(* com.xxx.web.*.service.impl.*.*(..))"
/> < aop:advisor
advice-ref = "txAdvice"
pointcut-ref = "allManagerMethod"
/> </ aop:config > |
問題是,現在在service.impl層又用到了Mybatis,還有JdbcTemplate,那麼他們的事務怎麼處理的?和hibernate的又有什麼關係?
經試驗發現Mybatis和JdbcTemplate的事務也是受spring管控的,就是說如果調用2個更新數據庫的方法,第二個方法出異常了,則第一個方法也會回滾,之前還擔心不能回滾的疑慮就消除了,可以放心大膽的使用Mybatis和JdbcTemplate了,因爲他們都是用的JDBC的事務,所以只有他們的數據源是一樣的就可以讓spring來管理事務
後來又做了個實驗
不在service.impl層調用Mybatis的方法和JdbcTemplate的方也法是可以的,但是沒有事務,即如果調用2個更新數據庫的方法,第二個方法出異常了,則第一個方法是不會回滾的
--------------------------------------------------------------分割線
又做了個實驗,換了下transactionManager,配置如下:
1
2
3
|
< bean
id = "transactionManager"
class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" > < property
name = "dataSource"
ref = "dataSource"
/> </ bean > |