`

方法中既有hibernate又有jdbc,加了@Transactional但事物回滚异常

 
阅读更多

写接口的时候,如果是数据库模式,经常会需要从对方数据库中直接提取数据,然后稍做处理,插入wms数据库,此时,一般就会在manager中既用到hibernate又用到jdbc,伪代码如下:其中接口getErpCompanyRowData方法是加了@Transactional的。

 

/**处理单条客户信息*/

1 public void getErpCompanyRowData(ResultSet rs, PreparedStatement ps, 

                Connection erp_con) throws SQLException {

2        ErpCompany ec = EntityFactory.getEntity(ErpCompany.class);

3        ec.setDownId(rs.getLong("downid"));

4        ec.setType(rs.getString("type"));

5        ec.setCompanyId(rs.getLong("companyid"));

6        ………可能很多set

7        commonDao.store(ec);

8

9       String sql = "update WMS_TRANSFERS_D_COMPANY set tranflag=1, downtime=? 

                        where downid=?";

10        ps = erp_con.prepareStatement(sql);

11        ps.setTimestamp(1, Timestamp.valueOf(DateUtil.getDateTime()));

12        ps.setObject(2, ec.getDownId(), Types.BIGINT);

13        ps.executeUpdate(); 

14        erp_con.commit();

15}

 

此时,如果第9行的sql执行异常,可能的结果就是wms保存了ErpCompany,但是erp的表记录没有

更新成功,出现事务不一致,既然加了@Transactional,为什么会出现这种情况?

 

原来,Spring配置的@Transactional只有碰到运行时异常RuntimeException才会回滚,这个方法

抛出的是SQLExceptionSQLException没有继承RuntimeException,所以Spring的事务提交了,

但是jdbc的事务失败了,造成事务不一致。

如何解决?在接口中配置@Transactional(rollbackFor=Exception.class),让Spring遇到Exception

就回滚,这样即可保证事务一致

分享到:
评论

相关推荐

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

    例如,在Service层的方法上添加此注解,Spring会在方法执行前后自动处理事务的开启和提交,如果方法中发生异常,Spring会回滚事务。这种方式大大简化了代码,避免了手动管理事务的复杂性。同时,Spring还提供了编程...

    spring的@Transactional注解用法解读

    Spring框架提供了一种统一的方式来处理事务管理,包括对不同事务API(如JTA、JDBC、Hibernate、JPA和JDO)的支持,并提供了声明式和编程式的事务管理方式。 1. **声明式事务管理** 声明式事务管理是Spring提供的...

    注解实现声明式事务管理

    当带有`@Transactional`注解的方法被调用时,Spring会创建一个代理,这个代理会在方法执行前后自动处理事务的开始、提交或回滚。 总之,Spring的注解式声明事务管理极大地简化了事务的管理,使得开发者可以专注于...

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

    在Java开发中,Spring框架和Hibernate是两个非常重要的组件,它们分别用于依赖注入和对象关系映射。在实际项目中,事务管理是确保数据一致性的重要环节。本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务...

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

    5. **异常与事务回滚**: 如果在@Transactional注解的方法中抛出未检查异常(继承自RuntimeException的异常)或者在@Transactional注解中明确列出的检查异常,Spring会自动回滚事务。否则,事务将在方法正常结束时...

    transaction.zip

    在Spring框架中,`@Transactional`注解是事务管理的核心元素,它允许开发人员在方法级别声明事务边界,从而简化了事务控制。本篇文章将深入探讨`@Transactional`注解的使用、工作原理以及相关配置。 `@...

    在Spring中配置Hibernate事务

    上述代码中,`addUser`方法将在一个事务中执行,如果发生异常,事务会被自动回滚。 6. **测试事务管理**: 编写单元测试或集成测试以验证事务的正确性。在测试中,可以故意引发异常,观察事务是否按照预期进行...

    spring hibernate mysql 事务实例

    在这个例子中,`addUser`方法被标记为`@Transactional`,这意味着如果在方法执行过程中出现异常,Spring会自动回滚事务,防止数据不一致。 Hibernate作为持久层框架,它自身也提供了事务管理,但通常在Spring环境下...

    在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通

    在IntelliJ IDEA中通过Spring Boot集成达梦数据库是一个现代应用程序开发的重要步骤,尤其是在Java生态中。本教程将深入探讨如何实现这一目标,从基础设置到高级应用,帮助你从入门到精通。达梦数据库是一款由中国...

    Spring/SpringMVC/MyBatis整合+事务回滚

    7. **实现事务回滚**:当在@Transactional注解的方法中发生异常时,Spring会自动回滚事务。例如,如果在保存数据时发生错误,整个事务将被回滚,保证数据的一致性。 8. **测试与调试**:完成整合后,通过编写单元...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    3. **AOP代理**: Spring通过AOP代理来拦截带有`@Transactional`的方法调用,自动处理事务的开始、提交或回滚。 4. **异常处理**: 声明式事务管理基于异常驱动,当方法抛出未检查异常(继承自`RuntimeException`)或...

    Spring+Hibernate注解事务实例

    如果方法执行过程中发生异常,Spring会默认回滚事务,否则在方法正常结束时提交事务。这是声明式事务管理的核心思想。 下面我们将详细讲解如何配置和使用Spring+Hibernate注解声明式事务: 1. **配置Spring**: -...

    JDBC和hibernate事务的详解

    本讲解将深入探讨JDBC(Java Database Connectivity)和Hibernate两种不同的技术在处理事务时的方法和特点。 ### 1. JDBC事务 JDBC是Java中用于与各种数据库交互的标准接口。在JDBC中,事务管理主要通过以下步骤...

    对Hibernate事物的理解

    在Hibernate中,如果在事务范围内抛出未检查异常(继承自RuntimeException的异常),事务会自动回滚;如果是检查异常,需要手动回滚。 ### 6. JTA(Java Transaction API) 在分布式环境中,Hibernate可以使用JTA...

    hibernate-junit4.0-postgresql-8.4-jdbc等jar包

    5. **整合Hibernate和JUnit**:在JUnit测试中,你可以利用Hibernate的`@Transactional`注解开启事务,确保测试的隔离性。同时,可以使用`SessionFactory`和`Session`的实例来完成数据库操作。 综上所述,这个压缩包...

    springmvc事务配置在service.zip

    上述代码中,`createUser`方法将在一个事务中执行,如果发生异常,整个事务将被回滚,确保数据一致性。 4. **事务属性**: `@Transactional`注解还可以接受一些属性,比如`propagation`(传播行为)、`isolation`...

    spring与hibernate的整合

    在 Spring 中使用 Hibernate 通常有两种方式:一是使用 HibernateTemplate 或 HibernateDaoSupport,另一种是直接使用 Hibernate 的原生 API。这里我们关注后者,通过 Spring 注入 SessionFactory 到 DAO 类中,然后...

    spring3hibernate4注解是事务管理

    Spring通过AOP(面向切面编程)来实现事务管理,当一个带有`@Transactional`的方法被调用时,Spring会在合适的时间点开始事务,然后在方法结束时根据异常情况决定是否提交或回滚事务。 Spring3和Hibernate4的注解...

    day36 09-Hibernate中的事务:事务处理

    在这个例子中,`addUser`方法会被Spring自动包裹在一个事务中,如果方法执行过程中发生异常,事务会回滚;否则,当方法执行完毕,事务会被提交。 **六、hibernate.cfg.xml配置** 在Hibernate的配置文件中,可以设置...

    spring-tx事物源码

    源码分析中,我们可以看到Spring如何在运行时解析`@Transactional`注解,如何创建和维护事务,以及如何处理异常以决定事务是否需要回滚。例如,当出现未检查异常(继承自`RuntimeException`的异常)时,Spring会默认...

Global site tag (gtag.js) - Google Analytics