一、 当你读这篇文章的时候,假如读者是在整合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回滚
分享到:
相关推荐
在.NET框架中,C#语言提供了对...总结来说,C#的事务回滚机制通过TransactionScope类提供了简便的事务管理,能够在多条SQL操作失败时保持数据一致性。理解并正确使用事务回滚对于编写健壮的数据库应用程序至关重要。
在探讨数据库事务回滚机制实例之前,我们先来理解一下什么是数据库事务以及为什么需要事务管理。数据库事务(Transaction)是指一组逻辑操作单元,这组操作要么全部成功,要么全部失败,是一个不可分割的工作单位。...
在这个“spring简单实例 事务回滚”的案例中,我们将深入探讨Spring如何处理事务回滚,以及它是如何在Java源码层面实现这一功能的。 首先,让我们理解什么是事务。在数据库操作中,事务是确保数据一致性的重要机制...
在.NET开发环境中,批量导入Excel数据...通过数据校验和事务回滚,我们可以确保数据的准确性和一致性,同时提供有效的错误处理机制。对于.NET开发者来说,熟练掌握这些技巧是提高工作效率和保证系统稳定性的必备技能。
例如,在一个银行系统中,如果用户想要转账,但是在转账过程中出现错误,事务回滚机制可以将数据库回滚到转账前的状态,以避免数据的不一致。 在 SpringBoot 中,我们可以使用注解方式来处理事务回滚。我们可以在...
本文将深入解析`@Transactional`的事务回滚机制,并通过实例来详细讲解其工作原理,帮助读者理解和应用这一核心功能。 一、`@Transactional`注解介绍 `@Transactional`是Spring提供的一个注解,用于在方法级别或类...
在Oracle数据库环境中,事务管理与存储过程的结合是实现数据一致性、事务回滚以及错误处理的关键技术之一。本文将深入探讨“Oracle事务回滚存储过程”这一主题,旨在理解其核心概念、工作原理以及实际应用。 ### ...
Oracle 回滚段是一种重要的数据库机制,它用于存放数据修改之前的值,以便在事务回滚或恢复时使用。然而,回滚段使用率过高可能会导致数据库性能下降和空间不足的问题。本文将介绍 Oracle 回滚段的概念、用法和规划...
总的来说,ThinkPHP的事务回滚功能是通过控制数据库事务的开始、提交和回滚来实现的,为开发人员提供了强大的错误恢复能力和数据保护机制。掌握这一功能的使用,有助于在开发过程中避免因数据操作异常导致的潜在问题...
例如,如果一个事务执行了一个插入(INSERT)操作,回滚日志中就会记录一个相应的删除(DELETE)操作,这样在事务回滚时,就可以执行这个删除操作来撤销插入。同样地,对于删除操作,回滚日志中会记录一个插入操作;...
.NET 2.0中的事务处理是软件开发中用于确保数据一致性的重要机制,特别是在涉及多资源操作的场景下。事务管理的核心目标是维护数据的ACID属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和...
而如果外部事务出错,同样会导致所有事务回滚。 然而,如果内部事务没有在Try-Catch块中运行,即使内部出错,外部事务仍然会提交,除非外部事务本身也有错误。这表明,Try-Catch块对内部事务的错误处理有着决定性的...
如果出现异常,事务回滚。 5. **并发控制**: 在高并发环境下,为了确保事务隔离性,数据库管理系统通常会采用各种并发控制策略,如读已提交(Read Committed)、可重复读(Repeatable Read)、序列化...
Laravel提供了简单易用的事务管理接口,本篇内容将详细解析在Laravel框架下如何正确使用事务回滚机制。 首先,Laravel框架中的事务管理主要依赖于底层的数据库抽象层组件,也就是DB门面(Facade),它提供了一系列...
3. **错误处理不当**:如文件中所示,错误处理机制如果没有正确实现,可能会导致事务回滚失败。例如,如果错误处理代码没有在事务中适当地使用`TRY...CATCH`结构,或者没有正确地调用`ROLLBACK`,则事务可能无法正确...
本篇文章将深入探讨Java Spring中的事务回滚机制。 首先,让我们了解异常的基本概念。在Java中,异常是程序运行时遇到的错误,分为两类:Error和Exception。Error是程序无法恢复的严重问题,如虚拟机错误,通常不需...
2. 回滚(Rollback):如果事务中的某个操作失败或发现错误,可以使用ROLLBACK语句将事务回滚到开始状态,撤销事务期间的所有更改。回滚是事务处理的一种异常结束,确保数据库状态保持一致。 3. 保存点(Savepoint...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...
浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...