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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。