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/
相关推荐
Hibernate提供了两种主要的事务处理模式:JDBC事务管理和JTA事务管理。 - **JDBC事务管理**:这是最基本的事务管理方式,适用于单个应用程序上下文中。它通过设置连接的自动提交属性为`false`来开启事务,并在提交...
在Spring框架中,为了管理和控制Hibernate事务,Spring提供了两种关键工具:HibernateTemplate和JdbcTemplate。这两个模板类简化了与数据库的交互,同时也处理了事务管理。让我们深入了解一下这两个类以及它们如何...
在Java中,事务管理有编程式和声明式两种方式。编程式事务管理需要开发者手动编写事务开始、提交和回滚的代码,而声明式事务管理则通过配置来定义事务边界,更易于维护和使用。 Spring的`TransactionInterceptor`是...
在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...
同时,Spring的事务管理机制是其核心功能之一,支持编程式和声明式两种方式,使得开发者可以方便地控制事务的边界。 其次,Hibernate是Java领域最流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作...
Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理通过注解或者XML配置实现,更为简洁且易于维护。 Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,...
首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编程的方式来控制事务的开始、提交、回滚等操作,通常使用`TransactionTemplate`或直接调用`...
2. **Hibernate事务**: Hibernate本身也提供了一种事务管理机制,但在Spring环境中,我们通常使用Spring的事务管理器来协调。当@Transactional注解应用于方法上,Spring会在该方法执行前后自动管理事务的开始和结束...
在Spring中,事务管理可以通过编程式和声明式两种方式实现。编程式事务管理需要手动调用开始、提交、回滚等方法,而声明式事务管理则更易于使用,只需在方法上添加@Transactional注解,Spring会自动处理事务的开始、...
7. **事务属性**:`@Transactional`注解有多个属性,如`propagation`(事务传播行为)、`isolation`(隔离级别)、`readOnly`(只读事务)、`rollbackFor`和`noRollbackFor`(指定异常类型触发或不触发回滚)。...
Spring 中的事务管理可以分为两种:编程式事务管理和声明式事务管理。编程式事务管理是指通过编程的方式来管理事务,而声明式事务管理是指通过配置的方式来管理事务。 事务管理的隔离级别 Spring 中的事务管理提供...
在Java开发中,Spring框架和Hibernate ORM工具是两个非常重要的组件。Spring提供了强大的依赖注入(DI)和面向切面编程(AOP),而Hibernate则是一个优秀的对象关系映射(ORM)解决方案,使得开发者可以方便地操作...
在Spring中,事务管理有两种方式:编程式和声明式。编程式事务管理需要开发者显式调用开始、提交、回滚等事务管理API,而声明式事务管理则更简洁,只需要在配置中声明事务属性,由Spring自动处理事务的生命周期。 ...
在Hibernate中,事务管理主要分为两种模式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**: 在编程式事务管理中,开发者需要手动开始、提交、回滚事务。这通常通过`Session`对象的`beginTransaction()...
集成的关键在于Spring的Transaction Management,它提供了声明式和编程式两种事务管理方式。声明式事务管理是通过在配置文件或注解中定义事务边界,无需在业务代码中显式处理事务开始、提交和回滚,更易于维护和管理...
Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用开始、提交、回滚等事务操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加简洁且易于维护。 1....
Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过 `PlatformTransactionManager` 接口及其实现类进行事务控制,而声明式事务管理则更常用,通过在方法或类上添加@Transactional...
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(Java Database Connectivity)和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. ...