【JavaWeb】事务管理

1. 事务管理

事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。

事务的操作主要有三步:

  1. 开启事务(一组操作开始前,开启事务):start transaction / begin ;
  2. 提交事务(这组操作全部成功后,提交事务):commit ;
  3. 回滚事务(中间任何一个操作出现异常,回滚事务):rollback ;

举例说明:当部门解散了不仅需要把部门信息删除了,还需要把该部门下的员工数据也删除了。但是当这两个业务功能之间有代码出错时,会出现把部门信息删除了,但是该部门下的员工数据仍然存在。此时就需要事务回滚,即部门信息不应该删除。

在这里插入图片描述

2. 事务应用

@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Transactional注解书写位置:

  • 方法(同时加在业务层service的增删改方法上)
    • 当前方法交给spring进行事务管理
    • 当前类中所有的方法都交由spring进行事务管理
  • 接口
    • 接口下所有的实现类当中所有的方法都交给spring 进行事务管理

在这里插入图片描述

此时即解决以上问题。


此外,我们可以使用注解 @EnableTransactionManagement 开启Spring对 @Transactional 注解的支持,使得在方法或类上添加 @Transactional 注解后,Spring能够捕获该注解并自动处理事务。

@EnableTransactionManagement注解的作用可以从以下几个方面理解:

  1. 启用事务管理:通过@EnableTransactionManagement注解,告诉Spring框架要启用事务管理功能。这样Spring就会自动创建并注册一个名为transactionManager的事务管理器,用于处理事务相关的操作。

  2. 定义事务管理器:除了默认的事务管理器transactionManager外,你还可以通过配置指定其他的事务管理器。通过在配置类中添加如下代码,可以创建一个名为myTransactionManager的事务管理器:

@Bean
public PlatformTransactionManager myTransactionManager() {
    // 创建并配置自定义的事务管理器
    // ...
}
  1. 事务属性配置:通过@EnableTransactionManagement注解,可以配置事务的默认属性。你可以使用传统的XML配置或者通过设置注解属性的方式来实现。例如,你可以设置事务的传播行为和隔离级别等。如果没有显式配置,则使用默认的事务属性。

可以在启动类开启注解方式的事务管理。(当然不使用该注解也是可以的,@Transactional 注解会默认开启事务管理)

在这里插入图片描述


此外,可以在application.yml配置文件中开启事务管理日志,这样就可以在控制看到和事务相关的日志信息了。

#spring事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

@Transactional注解当中的两个常见的属性:

  1. 异常回滚的属性:rollbackFor
  2. 事务传播行为:propagation

rollbackFor

默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。
假如我们想让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。

@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    
    @Override
    @Transactional(rollbackFor=Exception.class)
    public void delete(Integer id){
        //根据部门id删除部门信息
        deptMapper.deleteById(id);
        
        //模拟:异常发生
        int num = id/0;

        //删除部门下的所有员工信息
        empMapper.deleteByDeptId(id);   
    }
}

propagation

事务的传播行为:就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

例如:两个事务方法,一个A方法,一个B方法。在这两个方法上都添加了@Transactional注解,就代表这两个方法都具有事务,而在A方法当中又去调用了B方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?这个就涉及到了事务的传播行为。

通过 propagation 属性来指定传播行为。

属性值含义
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须没事务,否则抛异常

对于这些事务传播行为,常见的有:

  1. REQUIRED(默认值)
  2. REQUIRES_NEW(当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。)

比如 REQUIRES_NEW:

@Service
public class DeptLogServiceImpl implements DeptLogService {

    @Autowired
    private DeptLogMapper deptLogMapper;

	 //事务传播行为:不论是否有事务,都新建事务
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void insert(DeptLog deptLog) {
        deptLogMapper.insert(deptLog);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值