想了解一下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存取方法运行在一个事务中呢?小弟刚学hb,希望大家多多指教

解决方案 »

  1.   


    楼主似乎对事务的管理有些迷惑啊
    hibernate的事务通过显示的添加代码完成,
    Spring是通过动态代理切入运行时添加代码管理完成的,所谓AOP嘛
    如果Spring配置的是Hibernate事务管理,动态切入的代码应该是和手写hibernate事务管理基本一致的
    所以,无论用何种事务方式,只要保证事务里面的调用的所有方法没有被其他的事务管理就可以实现事务
      

  2.   

    hibernate可以采用手动管理事务的提交.先begin 再操作两个方法 ,然后submit()
      

  3.   

    个人认为这就是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的配置文件中配置一下就可以! 
      

  4.   

    事务是分层的 
    当一个事务A处于事务B
    中,如果仅仅事务A提交了,而事务B未提交,那么总的事务还是未提交!
      

  5.   

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

  6.   

    个人认为这就是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的配置文件中配置一下就可以!
      

  7.   

    分析的不错,hibernate学的还可以,spring暂时不懂。
      

  8.   

    9l 分析得很透彻  
    spring精彩的就是aop 和 ioc
      

  9.   

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