java事务异常控制_java异常Throwable和Sping事务控制的异常回滚

java异常Throwable和Sping事务控制的异常回滚

今天的讨论以一个项目中的实际问题入手:在后台管理系统中,对敏感数据的操作,

都需要记录审计日志。我们以修改为例,这个过程可以分解为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。附上图片一张,一目了

然。

0818b9ca8b590ca3270a3433284dd417.png

因此,在使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值