java异常Throwable和Sping事务控制的异常回滚
来源:互联网 发布:网络营销商劫持网络 编辑:程序博客网 时间:2024/05/21 09:35
java异常Throwable和Sping事务控制的异常回滚
今天的讨论以一个项目中的实际问题入手:在后台管理系统中,对敏感数据的操作,
都需要记录审计日志。我们以修改为例,这个过程可以分解为2步操作,对某个数据的修
改和插入日志。并且这2个操作具有原子性,要么都执行,要么都不执行。
很显然,这里需要进行事务控制。在当前流行的Sping框架中,我们使用Spring的
AOP进行事务控制。我们只需要配置Spring事务,然后程序运行期间,一旦我们调用了指
定的方法,Spring就会自动拦截改方法,然后在该方法执行前后,加上事务控制的字节
码。关于AOP的底层实现,可以参考《 从JVM的角度看Spring的AOP》
http://blog.csdn.net/reggergdsg/article/details/71039507
但是具体如何实现呢?先看下面的写法:
很遗憾的是,如果你的程序是这样写的,那么当update()执行完成以后,但是
insert()执行时报错了,这时候,update()操作是不会回滚的。为什么呢,这个就要说
一下Spring事务控制的异常回滚了。Spring官方文档是这样描述的:spring声明式事务管
理默认对非检查异常和运行时异常进行事务回滚,而对检查异常则不进行回滚操作。上
面的程序抛出的是Exception异常,所以Spring不会进行回滚。
说到这里,要多说一句,我们回顾一下java异常相关的知识。java异常的祖先是
Throwable,所有的java异常都直接或者间接继承了Throwable。附上图片一张,一目了
因此,在使用Spring的事务控制时,我们需要在catch中手动抛RuntimeException,
示例代码如下:
思考一个问题:如果这里抛了一个RuntimeException,这个异常会显示到页面,该如
何处理?
更安全的方式是使用TransactionAspectSupport类获取当前事务,然后强制回滚。关
于TransactionAspectSupport,Spring文档中是这样描述的: Base class for
transactional aspects, such as the AOP Alliance TransactionInterceptor or an
AspectJ aspect.This enables the underlying Spring transaction infrastructure
to be used easily to implement an aspect for any aspect system. 这种做法是
Spring支持的方式,并且不会抛RuntimeException,示例代码如下:
《旅夜书怀 · 杜甫》
细草微风岸,危樯独夜舟。
星垂平野阔,月涌大江流。
名岂文章著,官应老病休。
飘飘何所似,天地一沙鸥。
今天的讨论以一个项目中的实际问题入手:在后台管理系统中,对敏感数据的操作,
都需要记录审计日志。我们以修改为例,这个过程可以分解为2步操作,对某个数据的修
改和插入日志。并且这2个操作具有原子性,要么都执行,要么都不执行。
很显然,这里需要进行事务控制。在当前流行的Sping框架中,我们使用Spring的
AOP进行事务控制。我们只需要配置Spring事务,然后程序运行期间,一旦我们调用了指
定的方法,Spring就会自动拦截改方法,然后在该方法执行前后,加上事务控制的字节
码。关于AOP的底层实现,可以参考《 从JVM的角度看Spring的AOP》
http://blog.csdn.net/reggergdsg/article/details/71039507
但是具体如何实现呢?先看下面的写法:
try{ // 修改操作 update(); // 记录日志操作 insert();}catch(Exception e){ logger.info("异常" + e);}
很遗憾的是,如果你的程序是这样写的,那么当update()执行完成以后,但是
insert()执行时报错了,这时候,update()操作是不会回滚的。为什么呢,这个就要说
一下Spring事务控制的异常回滚了。Spring官方文档是这样描述的:spring声明式事务管
理默认对非检查异常和运行时异常进行事务回滚,而对检查异常则不进行回滚操作。上
面的程序抛出的是Exception异常,所以Spring不会进行回滚。
说到这里,要多说一句,我们回顾一下java异常相关的知识。java异常的祖先是
Throwable,所有的java异常都直接或者间接继承了Throwable。附上图片一张,一目了
然。
因此,在使用Spring的事务控制时,我们需要在catch中手动抛RuntimeException,
示例代码如下:
try{ // 修改操作 update(); // 记录日志操作 insert();}catch(Exception e){ logger.info("异常" + e); throws new RuntimeException();}
思考一个问题:如果这里抛了一个RuntimeException,这个异常会显示到页面,该如
何处理?
更安全的方式是使用TransactionAspectSupport类获取当前事务,然后强制回滚。关
于TransactionAspectSupport,Spring文档中是这样描述的: Base class for
transactional aspects, such as the AOP Alliance TransactionInterceptor or an
AspectJ aspect.This enables the underlying Spring transaction infrastructure
to be used easily to implement an aspect for any aspect system. 这种做法是
Spring支持的方式,并且不会抛RuntimeException,示例代码如下:
try{ // 修改操作 update(); // 记录日志操作 insert();}catch(Exception e){ logger.info("异常" + e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}
《旅夜书怀 · 杜甫》
细草微风岸,危樯独夜舟。
星垂平野阔,月涌大江流。
名岂文章著,官应老病休。
飘飘何所似,天地一沙鸥。
0 0
- java异常Throwable和Sping事务控制的异常回滚
- 异常、事务回滚
- Spring事务和异常回滚
- Spring事务回滚和异常类
- Spring事务异常回滚
- Spring事务异常回滚
- java事务异常——Spring事务异常回滚,捕获异常不抛出就不会回滚
- java事务异常——Spring事务异常回滚,捕获异常不抛出就不会回滚
- java异常处理Throwable Error和Exception之间的区别
- Java异常机制Throwable
- Java异常:Throwable
- JAVA--异常 throwable
- 72、java异常-Throwable
- Java异常机制Throwable
- Java异常机制Throwable
- java 异常处理 Throwable Error 和Exception
- java 异常处理 Throwable Error 和Exception
- java 异常处理 Throwable Error 和Exception
- Windows 文件操作
- 401. Binary Watch
- Hibernate状态 (merge,attachDirty,attachClean)
- 层次式电路设计与平坦式电路设计
- Cocos-Js项目中自己写的 HashMap
- java异常Throwable和Sping事务控制的异常回滚
- leetcode-53. Maximum Subarray
- 终身机器学习(Lifelong Machine Learning)
- 2015年需要了解的前端框架和语言
- 杭电oj(Java版)2602 Bone Collector 01背包问题
- ITK4.11.1编译配置+VS2015+Cmake3.8.1
- python wget下载文件处理的一些问题
- FPGA状态机总结
- Buy a Shovel