spring boot的事务管理简单入门

事务的重要性不需要再多做讲解,其主要作用在于保证多个操作的原子性,从而保证在异常出现的情况下的数据一致性。最早认识此概念大概是在接触DBMS的时候,除了数据库系统之外,web后端系统也需要使用事务来保证数据一致性。

spring框架提供了@Transactional注解来实现事务功能。该注解加在service层的接口、类、方法上均可,其效果是将方法交给spring进行事务管理,方法执行前开启事务,成功执行完毕后提交事务,如果出现异常则回滚事务。一般加在执行多次数据修改的方法上。

但是有时方法抛出异常,事务却没有进行回滚。原因可能在于默认情况下,只有出现运行时异常RuntimeException时才回滚事务。事务注解的rollbackFor属性用于控制出现何种异常时回滚事务。例如,配置出现所有异常时回滚事务:

@Transactional(rollbackFor = Exception.class)

此外,多个事务方法(加了注解的方法)发生相互调用时,存在事务传播行为的问题,指的是某事务方法被另一个事务方法调用时,它应该如何进行事务控制,比如是新建一个事务,还是加入已有事务。事务的传播行为由propagation属性控制,其默认值是REQUIRED,意为需要事务,有则加入,无则新建事务。另一个常用的有REQUIRES_NEW,意为需要新事务,总是新建事务。

一个应用场景如下所述。系统中的操作不论是否成功,都需要记录日志信息到日志表中,通常会把业务逻辑和日志记录逻辑分别使用service方法实现,并都加上事务注解。此时如果使用默认的传播行为,日志记录的逻辑会在已有的业务逻辑事务中执行,如果此时抛出异常,整个事务回滚,日志记录也会回滚,这就无法满足“无论操作是否成功都需要记录日志”的需求。因此,记录日志的service方法应该加上注解:

@Transactional(propagation = Propagation.REQUIRES_NEW)
posted @ 2025-02-13 16:22  随机生成一个id  阅读(42)  评论(0)    收藏  举报