Spring,Hibernate,Mybatis,JDBC事務之間的的關係

由於項目中既用到了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層拿到HibernateSession,如果在其它層調用會發生找不到session的異常,以上都比較好理解

問題是,現在在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>
即沒有用HibernateTransactionManager,發現對於JdbcTemplate的事務和以前一樣,即如果在service.impl層是受spring管控事務的,但是對於Hibernate,會出現拿不到session的異常,所以最佳實踐還是用 HibernateTransactionManager
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章