Spring的事务和Hibernate的事务有什么区别

来源:互联网 发布:网络推广专员岗位要求 编辑:程序博客网 时间:2024/04/29 10:06

Question:

想了解一下Spring的事务和Hibernate的事务有什么区别?Hibernate的crud都用到了Transaction,在方法开始时,打开事务,然后结束时提交事务,当Hb与Sp协作时,对于一个运行在服务层且在spring事务中的方法A,调用了运行在Dao层的方法B和C,B,C的操作是通过hb实现的,我就是想不通如下两点:

1 A方法调用B后,Hb事务不是提交了吗,也就是事务上下文在这里就中断了,如果再调用C,怎么能保证b和c在一个事务环境中呢?
2 我知道hb的事务控制是通过jdbc的,不是sp的是不是,如果也是,那么,对于每一个hb的存取操作,jdbc事务都应被提交,怎么可能让两个hb存取方法运行在一个事务中呢?


Answer

个人认为这就是SPRING框架做得比较精彩的部分拉!事务的传播&&AOP思想!
用框架管理事务就可以控制在每一个面上!你可以把事务控制在BO业务逻辑层,也可以控制在Dao层!
事务传播行为类型
PROPAGATION_REQUIRED
 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

正如你上面所讲的:A中调用了B,C两个方法,每个方法都是有自己的事务,如果你用SPRING管理,

spring就可以帮你做事务的传播!当然EJB也可以!

假如你是使用第一种类型:B中已经存在事务,C中又有一个新事务,spring就可以把C事务加到B中去!只有这两个方法执行成功,事务才会提交!

个人认为:用SPRING管理事务,HIBERNATE就可以不会事务处理拉!具体实现也比较简单!
就是用SPRING声明式事务管理,AOP思想!在SPRING的配置文件中配置一下就可以!

HibernateUtil 类是用两个ThreadLocal类型的属性以保持在一次请求中共享单一的session和transaction实例

Hibernate的事务是对底层数据库的JDBC/JTA等的封装 Spring则是对Hibernate等事务的封装


0 0