java事务异常控制

编程入门 行业动态 更新时间:2024-10-11 03:24:05

java事务<a href=https://www.elefans.com/category/jswz/34/1771210.html style=异常控制"/>

java事务异常控制

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

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

都需要记录审计日志。我们以修改为例,这个过程可以分解为2步操作,对某个数据的修

改和插入日志。并且这2个操作具有原子性,要么都执行,要么都不执行。

很显然,这里需要进行事务控制。在当前流行的Sping框架中,我们使用Spring的

AOP进行事务控制。我们只需要配置Spring事务,然后程序运行期间,一旦我们调用了指

定的方法,Spring就会自动拦截改方法,然后在该方法执行前后,加上事务控制的字节

码。关于AOP的底层实现,可以参考《 从JVM的角度看Spring的AOP》

但是具体如何实现呢?先看下面的写法:

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();

} 《旅夜书怀 · 杜甫》 细草微风岸,危樯独夜舟。 星垂平野阔,月涌大江流。 名岂文章著,官应老病休。 飘飘何所似,天地一沙鸥。

更多推荐

java事务异常控制

本文发布于:2024-02-13 21:51:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760902.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异常   事务   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!