`
xdy2008
  • 浏览: 52568 次
  • 性别: 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回滚
分享到:
评论

相关推荐

    PHP事务处理实例 mysql事务处理的意义

    mysql事务处理的意义 事务处理机制在程序开发过程中有着非常重要的作用,它可以使整个系统更加安全,例如...采用事务处理机制,一旦在转账过程中发生意外,则程序将回滚,不做任何处理。 MYSQL的事务处理主要有两种方法

    JDBC事务处理机制探秘

    1、JavaBean中使用JDBC事务处理 ...//回滚JDBC事务 16. exc.printStackTrace(); 17. dbc.close(); 18. return -1; 19. } 20. } 2、SessionBean中的JTA事务 。 。 。 。 。 。 。 。 。

    Springboot2.X基于可靠消息rabbitmq最终一致性分布式事务+分布式全局唯一ID生成器

    2、事务回滚机制说明  a、每个消费端的事务处理都由本地事务负责  b、基于下单队列消费端临时表,查询红包、积分两个队列消费端的临时表中该订单的处理的状态,如果全部为消费成功,则更新业务订单表中的订单...

    Spring Boot的Spring事务处理机制4大特性.docx

    一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作。 一致性(Consistency) 一旦事务完成(不管成功还是失败),系统必须确保涉及的数据处于一致的状态,而不会是部分完成部分失败。数据不...

    数据库并发控制机制——事务

    这是一个关于银行的数据库的处理,模仿的是从账户1转账给...那就需要用到事务,如果没有一起执行,就回滚。这个代码比较简单,希望对大家有帮助,自己建立一个数据库bank,在里面建立一个表Account,两属性:Id,money.

    php的PDO事务处理机制实例分析

    本文实例讲述了php的PDO事务处理机制。分享给大家供大家参考,具体如下: 事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行,并且在执行的过程中, 如果...

    MySql存储过程与事务处理教学PPT

    (程序员不是数据库管理员他可能不了解很多数据库的机制比如事务,错误回滚等.银行转帐问题可以解释.) 减轻客户端应用程序的负担 (让更多的操作由数据库服务器执行) MySql存储过程与事务处理教学PPT

    rabbitmq解决分布式事务

    消费者在消费消息的时候,如果消费者业务逻辑出现程序异常,这时候应该如何处理? 答案:使用消息重试机制。(springboot默认有消息重试机制) 消费者获取到消息后,调用第三方接口,但接口暂时无法访问,是否需要重试...

    一种基于JMS的分布式异步事务处理模型设计 (2010年)

    文章提出了一种基于Java消息服务(Java Message Service,JMS)的分布式异步事务处理模型,该模型采用非阻塞的事务处理机制即异步事务处理,支持并行处理子事务和全局事务部分回滚、恢复,提高了事务处理效率,增强了...

    oracle常见的锁查询和处理

    DML事务锁定的机制 行级锁(TX锁) 表级锁(TM锁) 锁定相关视图 v$transaction v$lock 5 v$enqueue_lock v$session 检测并解决冲突 常见的锁查询和处理 当前系统中存在的锁争用: 引发争用的session信息: 引发争...

    基于SpringBoot的秒杀系统设计与实现.zip

    库存管理 :系统实现了实时库存扣减和回滚机制,确保库存数据的准确性。安全性 :采用令牌桶限流算法,防止恶意用户刷单,保障正常用户的购买体验。可扩展性 :系统架构灵活,可根据业务需求进行水平扩展,满足不断...

    ASP中应用事务处理技巧

    但是如果执行一组SQL语句的操作,当其中某个步骤出错,就不能还原到最初的状态,这时候就需要使用事务处理机制来处理了。 ASP内置组件中的Connection对象,主要使用事务处理的方法有以下3个: BeginTrans :用于...

    数据库事务处理

    (1)、加深对事务概念的理解。 (2)、掌握SQL Server事务定义的方法。 (3)、学会使用保存点机制设置回滚点。

    数据库系统中事务的ACID原则.pdf

    只要事务回滚时,数据源可以撤消所有未提交的改变,那么这种技术应该可⽤于管理事务。 2. ⼀致性 事务在系统完整性中实施⼀致性,这通过保证系统的任何事务最后都处于有效状态来实现。如果事务成功地完成,那么系统...

    MSSQL与Oracle数据库事务隔离级别与锁机制对比

    只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态。 Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性。同时,并行事务的修改必须与其他并行...

    mysql innodb死锁问题详解.docx

    数据库也会发生死锁的现象,数据库系统实现了各种死锁检测和死锁超时机制来解除死锁,锁监视器进行死锁检测,MySQL的InnoDB处理死锁的方式是 将持有最少行级排它锁的事务进行回滚,相对比较简单的死锁回滚办法

    【分布式事务----LCN】LCN原理及使用方式.docx

    自动超时机制,任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时间限制以后事务模块将先确认事务状态,然后再决定执行提交或者回滚操作,主要为了给最大资源占用时间加上限制。...

    事务讨论笔记

    此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。 生产方和消费方定时扫描本地消息表,把还...

    seata1.3.0.zip

    不过还好的是,这种情况毕竟是特例,如果客户端服务是集群部署,那么seata是可以正常完成事务回滚的。 结语 从上面的情况来看,起码seata对于简单的分布式事务场景的高可用支撑是没问题的,但是seata毕竟还是一个新...

    jeesuite-libs-其他

    无需修改XML读写分离,事务内操作强制读主库基于注解自动缓存管理(所有查询方法结果自动缓存、自动更新,事务回滚缓存同步回滚机制)自动缓存实现基于jeesuite-cache和spring-data-redis分页组件敏感操作拦截...

Global site tag (gtag.js) - Google Analytics