文档章节

Spring,Hibernate,Mybatis,JDBC事务之间的的关系

whaon
 whaon
发布于 2012/11/23 11:42
字数 518
阅读 3922
收藏 16

由于项目中既用到了Hibernate,又用到了Mybatis,还用到了JdbcTemplate,比较纠结于他们的事务,抽了个时间好好研究了下,有理解不正确的地方,欢迎批评指正

大致的来说,事务可以分为以下2中:

1.JDBC的事务

2.JTA,容器的事务

由于不涉及到JTA,就不谈JTA的事务了

TransactionManager用的是HibernateTransactionManager,大概配置如下:

<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
</bean>

配置的事务是在service.impl层的,配置大概如下

<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,配置如下:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
</bean>
即没有用HibernateTransactionManager,发现对于JdbcTemplate的事务和以前一样,即如果在service.impl层是受spring管控事务的,但是对于Hibernate,会出现拿不到session的异常,所以最佳实践还是用 HibernateTransactionManager




© 著作权归作者所有

whaon

whaon

粉丝 49
博文 42
码字总数 38353
作品 0
厦门
程序员
私信 提问
加载中

评论(2)

whaon
whaon 博主

引用来自“dmi54825”的评论

我是hibernate和jdbc,用org.springframework.jdbc.datasource.DataSourceTransactionManager情况下hibernate不会回滚,用org.springframework.orm.hibernate5.HibernateTransactionManager都会回滚
那当然喽,既然用了hibernate,那就用HibernateTransactionManager准没错了
d
dmi54825
我是hibernate和jdbc,用org.springframework.jdbc.datasource.DataSourceTransactionManager情况下hibernate不会回滚,用org.springframework.orm.hibernate5.HibernateTransactionManager都会回滚
如何成为一名合格的Java工程师?

你想要成为一名合格的Java工程师吗,你知道作为一个Java工程师需要具备哪些核心技能吗,你知道在面试Java岗位的时候面试官会问你哪些专业技能吗? 一、专业技能 1、熟练的使用Java语言进行面...

紫魅编程
2016/09/27
598
2
mybatis-spring事务处理机制分析

Spring官方并没有提供对MyBatis的集成方案,于是MyBatis项目组自己写了一个项目mybatis-spring专门用于在spring中使用MyBatis。 mybatis-spring的实现很大程度上依赖spring jdbc的事务管理,...

fifadxj
2016/11/10
0
0
由for update引发的血案

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 老司机倾囊相授,带你一路进阶,来不及解释了快上车! 公司的某些业务用到了数据库的悲观...

后端进阶
05/17
0
6
2019BATJ面试题详解:MyBatis+MySQL+Spring+Redis+多线程

这里为大家分享一些面试的一手资料,供大家迎接接下来的金三银四跳槽季 Spring Spring 概述 什么是spring? 使用Spring框架的好处是什么? Spring由哪些模块组成? 解释AOP模块 Spring配置文件...

别打我会飞
03/20
0
0
轻量级的关系型数据库中间件 - Sharding-JDBC

Sharding-JDBC是一个开源的适用于微服务的分布式数据访问基础类库,它始终以云原生的基础开发套件为目标。 Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,...

亮_dangdang
2016/01/27
0
27

没有更多内容

加载失败,请刷新页面

加载更多

双因素认证绕过的钓鱼工具

研究人员发布了两个工具——Muraen和NecroBrowser。它们可以自动绕过2FA进行钓鱼攻击,大多数防御措施都无法抵御它们。 渗透测试人员和攻击者为他们的武器库添加了一个新的工具,这种工具可以...

Linux就该这么学
22分钟前
1
0
java代码和js两种方式判断浏览器是否是IE11

java代码判断浏览器是否是IE11 HttpServletRequest request = ServletActionContext.getRequest();String agent = request.getHeader("User-Agent");//判断是IE浏览器而且不是IE11的时......

平凡三度
25分钟前
1
0
2019 Vue开发指南:你都需要学点啥?

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/vue-development-in-2019-what-you-need-to-know 如果...

葡萄城技术团队
28分钟前
0
0
[gitlab]登录页定制

Administrator - 设置 https://blog.csdn.net/weixin_43606948/article/details/85222755 支持markdown,用###...

Danni3
36分钟前
1
0
IT兄弟连 Java语法教程 编写Java源代码

现在我们来一步一步的编写第一个Java程序,鼎鼎大名的“HelloWorld”。 编写Java源代码 编写Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本、Edit Plus等程序...

老码农的一亩三分地
51分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部