Spring事务控制和回滚

1在一个项目中ssh结构,spring2.5,事务控制采用的是tx拦截器的方式。

自己写了个 int a=1/0;异常抛出了,但是事务还是提交了,怎么搞都不行。

现将看到的一些事务控制总结下来:

事务控制默认回滚RuntimeException(数组越界,结果为0等),并且是notchecked异常。

注意:sql内部出现异常默认不会回滚

如果在Service中有 try ..catch的形式,则无法抛出异常,不会回滚。因此需要在catch中throw new runtimeException在方法上加上主动抛出。

在tx部分要注意可以设置 <tx:method roback-for=‘Exception‘,捕获自己指定的异常。如果使用声明式注解则为@Transactional(robackFor=Exception.class)

如果以上的方式还不行,就只能在Service的catch中使用以下的手动抛出。

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 

参考文章:

Spring transaction事务 roll back各种回滚)https://www.cnblogs.com/wangchuanfu/p/8110159.html

(Spring事务之使用tx标签配置拦截器)http://blog.sina.com.cn/s/blog_486c3b620100xuh7.html

Spring2.5事务配置的5种方法)https://www.cnblogs.com/gaoyoubo/articles/1861464.html

(Spring 事务属性分析)https://www.cnblogs.com/aliger/p/3898869.html

Spring声明式事务不回滚问题http://www.jianshu.com/p/f5fc14bde8a0

spring事务没回滚)https://www.cnblogs.com/lidelin/p/7266280.html

原文地址:https://www.cnblogs.com/DennyZhao/p/9325568.html

时间: 2024-08-24 19:02:51

Spring事务控制和回滚的相关文章

php中对MYSQL操作之事务控制,回滚

<?php //事务控制,回滚 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //判断是否链接成功 if($mysqli->connect_error){ die($mysqli->connect_error); } //由于在事务提交中系统默认提交,故这里设置为FALSE先不提交 $mysqli->autocomm

Spring事务超时、回滚的相关说明

事务超时: @Transactional(timeout = 60) 如果用这个注解描述一个方法的话,线程已经跑到方法里面,如果已经过去60秒了还没跑完这个方法并且线程在这个方法中的后面还有涉及到对数据库的增删改查操作时会报事务超时错误(会回滚). 如果已经过去60秒了还没跑完但是后面已经没有涉及到对数据库的增删改查操作,那么这时不会报事务超时错误(不会回滚). 回滚: Spring管理事务默认回滚的异常是什么? 答案是 RuntimeException或者Error. 注意:如果事务在try{

c++ mysql事务提交及回滚

之前在做有关数据库的操作时发现,有些内容应该作为一个事务一起提交,而不是每个都单独提交,这就需要把这些操作当做一个事务来处理.而我之前写过简单的数据库的操作,因为mysql默认的是自动提交,我们就需要用到api--mysql_commit(). mysql_commit(MYSQL* mysql, my_bool mode); mode为1时表示ON,mode为0时表示OFF. 在关掉自动提交后,以后我们的操作就需要自己手动提交了,而这就是我们所需要的了,对于一系列的操作,如果都成功了,那我们就

RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)

本文将重点分析RocketMQ Broker如何处理事务消息提交.回滚命令,根据前面的介绍,其入口EndTransactionProcessor#proce***equest: OperationResult result = new OperationResult();if (MessageSysFlag.TRANSACTION_COMMIT_TYPE == requestHeader.getCommitOrRollback()) { // @1result = this.brokerCont

spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

1 //假设这是一个service类的片段 2 3 try{ 4 //出现异常 5 } catch (Exception e) { 6 e.printStackTrace(); 7 //设置手动回滚 8 TransactionAspectSupport.currentTransactionStatus() 9 .setRollbackOnly(); 10 } 11 //此时return语句能够执行 12 return xxx; 如上: 当我们需要在事务控制的service层类中使用try cat

Spring Boot @Transactional 不回滚的解决办法

当抛出编译时异常时,事务不回滚,Employee成功插入数据. 1 @Transactional 2 public Employee saveEmployee() throws Exception { 3 Employee employee = new Employee(); 4 employee.setName("zz"); 5 employee.setAge(60); 6 employeeMapper.insert(employee); 7 8 if (employee.getAg

tx标签配置事务却无法回滚

xml配置如下: <!-- 属性文件读入 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:config/

Spring @Transactional注解不回滚不起作用无效

这几天在项目里面发现我使用@Transactional之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactional注解的特性吧,可以更好排查问题 1. service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式. 2. @Transactional 注解只能应用到 public 可见度的方

关于SAP的事务提交和回滚(LUW)

1 Sap的更新的类型 在sap中,可以使用CALL FUNCTION ... IN UPDATE TASK将多个数据更新绑定到一个database LUW中.程序使用COMMIT WORK提交修改请求.在sap中将更新分四种类型: 1.1 Asynchronous Update(异步更新):在这种情况,调用程序提交事务不需要等待Update Work Process完成数据更新处理. 1.2 Updating Asynchronously in Steps(多步异步更新): 这种更新分两步.