JAVA-事务 - 学习历程 - ITeye技术网站

寒江独钓 关注

收藏于 : 2017-04-23 16:28   被转藏 : 1   

JAVA-事务

    博客分类:
  • java
java 
http://blog.csdn.net/huilangeliuxin/article/details/43446177
以上一系列文章



比如Serveice里面的某个受写事务控制的方法A里面可能会调用其他service里的B方法(此方法也是受事务控制的),也可能会调用Dao里的某些方法。
其实,说白了,所有的业务上的事务底层都是数据库事务实现的。
受事务控制的方法里面所有地方用的数据库连接都是同一个,A和B是否走同一个事务有几种情况可能出现:
1、如果A受事务控制,B不受事务控制,则B肯定会跟着A走同一个事务。
2、如果A受事务控制,B也受事务控制,则B是否和A走同一个事务是根据配置的事务传播特性决定的(一般是Spring的配置文件里配置的),最常见常用的配置是propagation="REQUIRED",
这个配置就表示A方法里面所有调用的其他service里的方法或Dao里的方法,都是和A走的同一个事务。
当然,如果把propagation配置成其他属性,会出现A和B各自用不同的事务,也就是说A和B分别开启事务,这种的就会存在一种情况就是,程序在A里面执行开启一个事务,当执行到B又单独
开启一个事务,之后B执行完了,A再继续执行,此时A报错了,A进行回滚,但是由于B和A的事务是分开的,所以B不会回滚,这就相当于不是所有的业务逻辑都回滚了,还差一部分,而那一部分
自己恢复不了了,还得想其他办法。


A和B到底走一个事务还是走两个事务,是根据配置的事务传播特性决定的,咱们当前配置的都是REQUIRED,这种的A和B都是走同一个事务的。


假如B在执行的过程中抛异常或报错了,但是B自己捕获处理了,这种的就不会报错,会继续往下执行,事务也不会回滚。
假如B在执行的过程中抛异常或报错了,但是B没有处理,直接抛出了,抛给A了,A也可以进行捕获处理,
如果A捕获处理了,那事务不会管,继续往下执行,如果A没有捕获,继续往上抛,从A这个方法里抛出去了,抛给上层,这种的A事务就会直接回滚。
说白了,也就是说,无论什么情况,只要从A方法里直接抛出异常或错误了,那么对应A的那个事务直接就会回滚。如果出错了,但是在A里面自己捕获处理了,这种的事务不会回滚,继续往下执行。


但是假如A里面出现了远程服务调用(http或hessian调用),这种的如果在执行的过程中远程调用出现问题抛出异常或抛出错误(http调用或hessian调用抛出异常或错误),这种的如果在A里面
没有捕获处理的话那就会直接在A方法抛出异常,抛给上层,这种的A对应的事务会回滚,A里面不涉及远程调用的其余的业务都能回滚,但是远程调用里面的已经改过的业务就回滚不了了,因为
在远程他也不知道自己要回滚,也没有办法回滚。这种的一般处理方式有下面几种:
1、也有处理的策略是,先让远程操作成功,然后本地操作。本地失败,调用远程失败接口(必须提供远程的失败回滚接口)。这种是要求比较严格的那种。就是这次操作必须两边一致。
2、另一种方式是,假设我A系统成功了,然后我就想办法让B执行成功。如果失败了,我通过定时任务或者队列,一直调用直到成功结束。




这里会配置只要继承exception的异常被抛出,都要回滚


可以多看看 慕课网上关于事务的视频。沈寻
  • 大小: 28.3 KB
分享到:
参考知识库
Java SE知识库 25501  关注 | 479  收录
Java 知识库 25384  关注 | 1456  收录
Java EE知识库 17397  关注 | 1301  收录
JavaScript知识库 14274  关注 | 1514  收录
jQuery知识库 8635  关注 | 948  收录
AngularJS知识库 4668  关注 | 566  收录
评论
 阅读文章全部内容  
点击查看
文章点评
相关文章
寒江独钓 关注

文章收藏:1257

TA的最新收藏