spring事务回滚问题】的更多相关文章

1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和Exception继承Throwable.Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked). Error异常 Error表示程序在运行期间出现了十分严重.不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误.Error是一种unchecked Exception,编译器不会检查Error是否被处理,在…
事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用TransactionTemplate. 声明式事务管理建立在AOP之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回…
刚刚接到一个上家公司同事的一个电话,问我为什么service方法事务不会滚了,日志打印了,调用webservice报错. 我让他把这个调用执行webservice的方法截图发给我,如下:   public Object[] send(String operationName,Object[] params,String endPoint) throws Exception { Object[] results = null; Client client = null; try { // 获取外部…
1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocation#proceed 后续: 1.2:threadLocal 1.3:事务核心代码 org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction /** * 每个被 @Tra…
还可以设置回滚点,看下面 /** * 用户登录接口 * * * 1明确事务方法前的命名规则 * 2保证事务方法执行的时间尽可能的短,不允许出现循环操作,不允许出现RPC等网络请求操作 * 3不允许所有的方法都使用事务,节省服务器性能和缩短数据库连接时间 * 4如果出现有多个地方需要事务回滚时,使用自定义或原有的异常进行抛出,异常必须继承RunTimeError,否则不会触发回滚操作 * 5使用TransactionAspectSupport.currentTransactionStatus().…
1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: public method() { Dao1.save(Person1); Dao1.save(Person2); Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中 Dao1.save(Person2); } 期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存 正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据…
在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例比如配置文件里有这么条记录: <bean id="dataSource" class="xxx"> <property name="xxx" value="xxx"/> <property name="xxx&…
这篇文章讲解了怎么配置才能让spring事务捕捉异常 http://www.360doc.com/content/12/1109/18/6161903_246870991.shtml 需要正确配置spring事务控制的范围,比如是哪些service spring事务只能控制service方法的一次调用过程事务,不能控制多个service方法的调用过程事务 如果第一个service方法调用成功,第二个service方法调用失败,之前的service方法不会回滚…
配置事物: @Configuration /**强制使用cglib代理时就把proxy-target-class设为true.*/ @EnableTransactionManagement(proxyTargetClass=true) public class DataBaseConfiguration implements TransactionManagementConfigurer{ @Bean(name="testpackageTransactionManager") @Qua…
在事务中实行的方法:org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction 真正通过connecttion调用回滚的代码:org.springframework.jdbc.datasource.DataSourceTransactionManager#doRollback 获取数据库连接的方法:org.springframework.jdbc.datasource.D…
在平时的业务难免会遇到 sql异常. 有些业务会涉及 一个方法多个操作例如 dao.update() 1 dao.save(); 2 如果1正常,2不正常.默认是不回滚的. 所以在这个地方要手动处理 try  throw 的时候 ,不要抛 SQLException Exception 均不会回滚.亲测 源码 DefaultTransactionAttribute 自己自定义异常,throw runtimeException即可.并做好log记录.…
spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: ? 1 2 3 4 5 6 7 public method() {   Dao1.save(Person1);   Dao1.save(Person2);     Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中   Dao1.save(Person2); } 期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存 正…
今天客户提出一个新问题,出库一批商品,提示失败了,但是库存数量却减少了.看了一下代码一头雾水,我们的代码加了事物,且捕获异常. 经过调试代码发现就是两个原因导致的 第一.在当前方法的catch中处理了捕获的异常,没有向上抛出异常,事务不能回滚 分析: 1.在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类: 2.RuntimeException,即运行时异常,为非受检(UNCHECKED)异常…
Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exception才会触发回滚 */ public class TestServiceImpl extends Service implements TestService …
工作原理运行配置@Transactional注解的测试类的时候,具体会发生如下步骤1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中.在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]2)事务结束时,回滚在第1步骤中得到的代理conne…
背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 测试用业务逻辑方法: /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exceptio…
    使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务,这种方式大大的简化了编码.需要注意的是切入点表达式一定要写正确. 注解事务:直接在Service层的方法上面加上@Transactional注解,个人比较喜欢用这种方式. 2.事务不回滚的原因     在工作中…
转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Tran…
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Transactional注解事务的特性,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式. 2.@Transactional 注解只能应用到 publ…
1.事务控制概述   1.1.编程式事务控制         自己手动控制事务,就叫做编程式事务控制.         Jdbc代码: connection.setAutoCommit(false);  // 设置手动控制事务         Hibernate代码: session.beginTransaction();   // 开启一个事务                                transaction.rollback();  //事务回滚       [细粒度的事…
1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改的数据则修改回去,删除的则新增, 这就是事务操作. 事务有四大特性 (1)原子性:要么全部执行成功,要么不执行. (2)一致性:事务执行的结果,必须使数据库从一个一致性状态变到另一个一致性状态. (3)隔离性:并发操作同一个表时数据库会开启多个事务,多个事务之间相互隔离. (4)持久性:当事务确认完…
使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作.那么什么是检查型异常什么又是非检查型异常呢?最简单的判断点有两个:1.继承自RunTimeException或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类).2.对非检查型类异…
再说下声明式事务和注解事务回滚的原理:当被切面切中或者是加了注解的方法中抛出了RuntimeException异常时,Spring会进行事务回滚.默认情况下是捕获到方法的RuntimeException异常,也就是说抛出只要属于运行时的异常(即RuntimeException及其子类)都能回滚:但当抛出一个不属于运行时异常时,事务是不会回滚的. 下面说几点保证事务能回滚的方法: ① 声明式事务,在配置里面添加一个rollback-for,代码如下 <tx:method name="upda…
MySQL数据库一共向用户提供了包括BDB.HEAP.ISAM.MERGE.MyISAM.InnoDB以及Gemeni这7种Mysql表类型.其中BDB.InnoDB属于事务安全类表,而其他属于事务非安全类表. InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而Inno…
Spring中的@Transactional(rollbackFor = Exception.class)属性详解 序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常 error是一定会回滚的 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是…
以前的事务采用的是JTA,xml注入的方式.本人就着开发要优雅合理利用轮子的态度,一直不满意JTA式的申明和切入方式. spring的注解方式多优雅,可是万恶的直到项目快要上线时终于找到了注解式不能回滚的缘由. Spring的事务回滚,当且仅当捕获到RuntimeException类型异常时,才会回滚,对普通Exception异常无效. 满满一把心酸泪,,, 原理:代码贴上: 配置可参考如下:http://blog.csdn.net/greensurfer/article/details/752…
转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTemplate.搭框架时,发现了一个事务无法正常回滚的问题,记录如下: 首先展示问题: Spring applicationContext.xml配置: <bean id="dataSource" class="org.springframework.jndi.JndiObj…
导读:​一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着<XX公司关于三十岁员工优化通知>走了过来...... # 01 产线部分数据丢失了,因为一个蹊跷的事务回滚.而造成事务回滚的,竟然是一段被try-cath包裹后的代码,一段已经在产线稳定运行了200天的代码,稳定到我们已经把它遗忘了.谁也没想到的是,它竟然以这样一种方式重新回到了我们的视野,宣告…
自动任务类: @PersistJobDataAfterExecution @DisallowConcurrentExecution public class ReCodeBack implements Job { private static final Logger LOGGER = LoggerFactory.getLogger(ReCodeBack.class); @Autowired ReCodeBackTag reCodeBackTag; @Override public void e…
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性 1.创建表 Create table tUser( UserCode varchar(50), UserName varchar(50), UserDuty varchar(50), UserTel varchar(100)); 2.事务回滚方法一:(记录错误条数) decla…