由于项目中既用到了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
>
|