`
xdy2008
  • 浏览: 53887 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

事务回滚机制的处理

阅读更多
一、 当你读这篇文章的时候,假如读者是在整合j2EE的三大框架式遇到这个问题,那应该就是下面这个问题:
  
    我记得当时我遇到这个问题的时候,是因为数据库的表,不支持事务!如果mysql不支持存储引擎,它将以MyISAM表创建表,这是非事务性表。一般修改成InnoDB.

    假如有兴趣了解 mysql中 " engine=innodb " 以及 " engine=innodb 和engine=myisam的区别 ",可以读读这篇文章,或许对读者有帮助:http://blog.sina.com.cn/s/blog_6ac4c6cb01018pb1.html

    可使用下述语句之一检查表的标类型:
    SHOW TABLE STATUS LIKE 'tbl_name';
    SHOW CREATE TABLE tbl_name;
  使用下述语句,可检查mysqld服务器支持的存储引擎:
  
    SHOW ENGINES;

    也可以使用下述语句,检查与你感兴趣的存储引擎有关的变量值:

    SHOW VARIABLES LIKE 'have_%';

  例如,要想确定InnoDB存储引擎是否可用,可检查have_innodb变量的值。


二 、假如读者不是上述情况,那请研读下面这段:
--------------------------------------------------------------------------------------------------

近日测试用例,发现这样一个现象:

在业务代码中,有如下两种情况,比如:
throw new RuntimeException("xxxxxxxxxxxx"); 事务回滚
throw new Exception("xxxxxxxxxxxx"); 事务没有回滚

自以为很了解事务,或许时间久远的缘故,没分析出来何故,遂查阅了下资料,写下了如下的内容,供参考:

1).Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚, “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常” ,要想捕获非运行时异常则需要如下配置:
解决办法:
1.在针对事务的类中抛出RuntimeException异常,而不是抛出Exception。
2.在txAdive中增加rollback-for,里面写自己的exception,例如自己写的exception:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="*" rollback-for="com.cn.untils.exception.XyzException"/>
  </tx:attributes>
</tx:advice>

或者
定义不会滚的异常

<tx:advice id="txAdvice">
    <tx:attributes>
       <tx:method name="update*" no-rollback-for="IOException"/>
       <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

2).spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。
一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。

如:
try { 
    //bisiness logic code 
} catch(Exception e) { 
    //handle the exception 

由此可以推知,在spring中如果某个业务方法被一个 整个包裹起来,则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。
不过,如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可。

3).基于注解的事务:
Transactional的异常控制,默认是Check Exception 不回滚,unCheck Exception回滚
如果配置了rollbackFor 和 noRollbackFor 且两个都是用同样的异常,那么遇到该异常,还是回滚
rollbackFor 和noRollbackFor 配置也许不会含盖所有异常,对于遗漏的按照Check Exception 不回滚,unCheck Exception回滚
分享到:
评论

相关推荐

    简单的c#事务回滚实例代码

    在.NET框架中,C#语言提供了对...总结来说,C#的事务回滚机制通过TransactionScope类提供了简便的事务管理,能够在多条SQL操作失败时保持数据一致性。理解并正确使用事务回滚对于编写健壮的数据库应用程序至关重要。

    有关数据库事务回滚机制实例

    在探讨数据库事务回滚机制实例之前,我们先来理解一下什么是数据库事务以及为什么需要事务管理。数据库事务(Transaction)是指一组逻辑操作单元,这组操作要么全部成功,要么全部失败,是一个不可分割的工作单位。...

    spring 简单实例 事务回滚

    在这个“spring简单实例 事务回滚”的案例中,我们将深入探讨Spring如何处理事务回滚,以及它是如何在Java源码层面实现这一功能的。 首先,让我们理解什么是事务。在数据库操作中,事务是确保数据一致性的重要机制...

    批量导入Excel数据到数据库,带数据校验/事务回滚

    在.NET开发环境中,批量导入Excel数据...通过数据校验和事务回滚,我们可以确保数据的准确性和一致性,同时提供有效的错误处理机制。对于.NET开发者来说,熟练掌握这些技巧是提高工作效率和保证系统稳定性的必备技能。

    使用SpringBoot注解方式处理事务回滚实现

    例如,在一个银行系统中,如果用户想要转账,但是在转账过程中出现错误,事务回滚机制可以将数据库回滚到转账前的状态,以避免数据的不一致。 在 SpringBoot 中,我们可以使用注解方式来处理事务回滚。我们可以在...

    Spring中@Transactional事务回滚(含实例

    本文将深入解析`@Transactional`的事务回滚机制,并通过实例来详细讲解其工作原理,帮助读者理解和应用这一核心功能。 一、`@Transactional`注解介绍 `@Transactional`是Spring提供的一个注解,用于在方法级别或类...

    oracle 事务 回滚 存储过程

    在Oracle数据库环境中,事务管理与存储过程的结合是实现数据一致性、事务回滚以及错误处理的关键技术之一。本文将深入探讨“Oracle事务回滚存储过程”这一主题,旨在理解其核心概念、工作原理以及实际应用。 ### ...

    oracle回滚段使用率过高之解决方法

    Oracle 回滚段是一种重要的数据库机制,它用于存放数据修改之前的值,以便在事务回滚或恢复时使用。然而,回滚段使用率过高可能会导致数据库性能下降和空间不足的问题。本文将介绍 Oracle 回滚段的概念、用法和规划...

    ThinkPHP实现事务回滚示例代码

    总的来说,ThinkPHP的事务回滚功能是通过控制数据库事务的开始、提交和回滚来实现的,为开发人员提供了强大的错误恢复能力和数据保护机制。掌握这一功能的使用,有助于在开发过程中避免因数据操作异常导致的潜在问题...

    45 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理!l.pdf

    例如,如果一个事务执行了一个插入(INSERT)操作,回滚日志中就会记录一个相应的删除(DELETE)操作,这样在事务回滚时,就可以执行这个删除操作来撤销插入。同样地,对于删除操作,回滚日志中会记录一个插入操作;...

    NET 2.0中的事务处理、回滚处理

    .NET 2.0中的事务处理是软件开发中用于确保数据一致性的重要机制,特别是在涉及多资源操作的场景下。事务管理的核心目标是维护数据的ACID属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和...

    嵌套事务的回滚与提交.pdf

    而如果外部事务出错,同样会导致所有事务回滚。 然而,如果内部事务没有在Try-Catch块中运行,即使内部出错,外部事务仍然会提交,除非外部事务本身也有错误。这表明,Try-Catch块对内部事务的错误处理有着决定性的...

    C# 事务处理机制

    如果出现异常,事务回滚。 5. **并发控制**: 在高并发环境下,为了确保事务隔离性,数据库管理系统通常会采用各种并发控制策略,如读已提交(Read Committed)、可重复读(Repeatable Read)、序列化...

    在laravel中实现事务回滚的方法

    Laravel提供了简单易用的事务管理接口,本篇内容将详细解析在Laravel框架下如何正确使用事务回滚机制。 首先,Laravel框架中的事务管理主要依赖于底层的数据库抽象层组件,也就是DB门面(Facade),它提供了一系列...

    SQL写了回滚无效 回滚没用

    3. **错误处理不当**:如文件中所示,错误处理机制如果没有正确实现,可能会导致事务回滚失败。例如,如果错误处理代码没有在事务中适当地使用`TRY...CATCH`结构,或者没有正确地调用`ROLLBACK`,则事务可能无法正确...

    Java Spring 事务回滚详解

    本篇文章将深入探讨Java Spring中的事务回滚机制。 首先,让我们了解异常的基本概念。在Java中,异常是程序运行时遇到的错误,分为两类:Error和Exception。Error是程序无法恢复的严重问题,如虚拟机错误,通常不需...

    ORACLE事务处理机制探析.pdf

    2. 回滚(Rollback):如果事务中的某个操作失败或发现错误,可以使用ROLLBACK语句将事务回滚到开始状态,撤销事务期间的所有更改。回滚是事务处理的一种异常结束,确保数据库状态保持一致。 3. 保存点(Savepoint...

    详解Hibernate事务处理机制

    ### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

Global site tag (gtag.js) - Google Analytics