`

hibernate 的事务传播中两种类型的区别

阅读更多

hibernate 的事务传播中两种类型的区别

最常用的两种就是

 

REQUIRED(0)
REQUIRES_NEW(3),

两者的区别:

REQUIRED(0):若当前存在一个事务,则加入该事务,而不用创建;

REQUIRES_NEW(3):不管当前是否存在事务,都会创建一个新的事务

这种区别会造成什么影响呢?

比如事务A 中调用其他类的方法 updateXXX,

隔离级别是REQUIRED(0):

如果事务A 是只读的,那么方法 updateXXX中若有更新数据库操作,则不会执行更新,即所有操作都是只读.

即事务A中 各种方法的执行,可读写特性和事务A保持一致.

 

隔离级别是REQUIRES_NEW(3):

在方法 updateXXX 中,会创建一个新的事务,由于声明式事务管理,所以这个新创建的事务肯定是可读写的.

 

 

说一个实际案例

Service类 com/house/ujiayigou/service/HouseInfoService.java

调用 Dao类的方法

com/house/ujiayigou/dao/InspectionOrderDao.java 的 queryInspectIdByHouseInfo方法

但是方法queryInspectIdByHouseInfo 中抛出了异常

 

 

在Service方法中该异常被捕获了,没有再次抛出,

 

 

后来由于数据的问题,导致dao 方法确实抛出了异常,

在Service方法中也成功捕获了,业务逻辑正常执行.

可是奇怪的是,最后还是报错了,而且是莫名其妙的错误:

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

而且通过堆栈信息 根本看不出哪里哪行代码出了错.

 

后来发现原因是这样的:

例如Service 方法的执行在事务A中,当执行Dao 方法时,没有创建一个新的事务,

但是Dao 方法抛出了异常,所以hibernate把这个事务标记成为需要rollback的了

所以最后抛出了回滚的异常.

 

如果把InspectionOrderDao.java 的 queryInspectIdByHouseInfo方法 的事务隔离级别改为:REQUIRES_NEW

就没有问题了



 

参考:http://blog.didispace.com/springboottransactional/

http://hw1287789687.iteye.com/blog/2424893

  • 大小: 206.9 KB
  • 大小: 179.4 KB
  • 大小: 159.9 KB
0
0
分享到:
评论

相关推荐

    详解Hibernate事务处理机制

    Hibernate提供了两种主要的事务处理模式:JDBC事务管理和JTA事务管理。 - **JDBC事务管理**:这是最基本的事务管理方式,适用于单个应用程序上下文中。它通过设置连接的自动提交属性为`false`来开启事务,并在提交...

    Spring控制Hibernate中的事务传播特性与隔离级别操作.docx

    在Spring框架中,为了管理和控制Hibernate事务,Spring提供了两种关键工具:HibernateTemplate和JdbcTemplate。这两个模板类简化了与数据库的交互,同时也处理了事务管理。让我们深入了解一下这两个类以及它们如何...

    Spring Hibernate事务实例

    在Java中,事务管理有编程式和声明式两种方式。编程式事务管理需要开发者手动编写事务开始、提交和回滚的代码,而声明式事务管理则通过配置来定义事务边界,更易于维护和使用。 Spring的`TransactionInterceptor`是...

    在Spring中配置Hibernate事务

    在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...

    spring hibernate 事务管理学习笔记(一)

    同时,Spring的事务管理机制是其核心功能之一,支持编程式和声明式两种方式,使得开发者可以方便地控制事务的边界。 其次,Hibernate是Java领域最流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作...

    Spring+Hibernate注解事务实例

    Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理通过注解或者XML配置实现,更为简洁且易于维护。 Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,...

    spring hibernate 事务管理学习笔记(二)

    首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编程的方式来控制事务的开始、提交、回滚等操作,通常使用`TransactionTemplate`或直接调用`...

    spring mvc+hibernate 实现事务管理(全注解版)

    2. **Hibernate事务**: Hibernate本身也提供了一种事务管理机制,但在Spring环境中,我们通常使用Spring的事务管理器来协调。当@Transactional注解应用于方法上,Spring会在该方法执行前后自动管理事务的开始和结束...

    SpringHibernate事务及传播特性

    在Spring中,事务管理可以通过编程式和声明式两种方式实现。编程式事务管理需要手动调用开始、提交、回滚等方法,而声明式事务管理则更易于使用,只需在方法上添加@Transactional注解,Spring会自动处理事务的开始、...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    7. **事务属性**:`@Transactional`注解有多个属性,如`propagation`(事务传播行为)、`isolation`(隔离级别)、`readOnly`(只读事务)、`rollbackFor`和`noRollbackFor`(指定异常类型触发或不触发回滚)。...

    spring3.0两种事务管理配置

    Spring 中的事务管理可以分为两种:编程式事务管理和声明式事务管理。编程式事务管理是指通过编程的方式来管理事务,而声明式事务管理是指通过配置的方式来管理事务。 事务管理的隔离级别 Spring 中的事务管理提供...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    在Java开发中,Spring框架和Hibernate ORM工具是两个非常重要的组件。Spring提供了强大的依赖注入(DI)和面向切面编程(AOP),而Hibernate则是一个优秀的对象关系映射(ORM)解决方案,使得开发者可以方便地操作...

    Spring AOP管理Hibernate事务(TransactionInSpringAOP)

    在Spring中,事务管理有两种方式:编程式和声明式。编程式事务管理需要开发者显式调用开始、提交、回滚等事务管理API,而声明式事务管理则更简洁,只需要在配置中声明事务属性,由Spring自动处理事务的生命周期。 ...

    hibernate事务管理

    在Hibernate中,事务管理主要分为两种模式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**: 在编程式事务管理中,开发者需要手动开始、提交、回滚事务。这通常通过`Session`对象的`beginTransaction()...

    Spring与Hibernate集成---声明式事务

    集成的关键在于Spring的Transaction Management,它提供了声明式和编程式两种事务管理方式。声明式事务管理是通过在配置文件或注解中定义事务边界,无需在业务代码中显式处理事务开始、提交和回滚,更易于维护和管理...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用开始、提交、回滚等事务操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加简洁且易于维护。 1....

    spring,struts,hibernate,事务配置

    Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过 `PlatformTransactionManager` 接口及其实现类进行事务控制,而声明式事务管理则更常用,通过在方法或类上添加@Transactional...

    Hibernate+中文文档

    3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. ...

    spring分别与jdbc和hibernate结合的事务控制--案例

    本案例重点探讨了Spring如何与两种流行的数据访问技术——JDBC(Java Database Connectivity)和Hibernate——相结合,进行事务管理。事务控制是确保数据库操作一致性、完整性的关键,尤其在多步骤操作中,它能防止...

    hibernate3.2中文文档(chm格式)

    3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. ...

Global site tag (gtag.js) - Google Analytics