事务的基本概念

事务

概念

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

注意:默认MySQL的事务是自动提交的,也就是说,当执行了一条DML语句,MySQL会立即隐式的提交事务

操作

  • 开启事务:start transaction; / begin;

  • 提交事务:commit;

  • 回滚事务:rollback;

--开启事务
start transaction;
--执行语句
...
...
...
--提交事务
commit;

--回滚事务
rollback;

四大特性(ACID)

1.原子性

事务是不可分割的最小单元,要么全部成功,要么全部失败

2.一致性

事务完成时,必须使所有的数据都保持一致状态

3.隔离性

数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

4.持久性

事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

Spring事务管理

  • 注解:@Transactional

  • 位置:业务(service)层的方法上、类上、接口上

  • 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务。

@Transactional属性

1.rollbackFor
  • 默认情况下,只有 出现RuntimeException才会回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务
@Transactional(rollbackFor = Exception.class)
//spring事务管理  rollbackFor指定执行回滚操作的异常类型,Exception.class表示所有异常
    @Override
    public void delete(Integer id) {
        deptMapper.deleteById(id);
        int i = 1 / 0;//RuntimeException
        if(true){
            throw new Exception("出错啦...")
        }
        empMapper.deleteByDeptId(id);
    }
2.Propagation
  • 事务传播行为:指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制
属性值含义
REQUIRED[默认值]需要事务,有则加入,无则创建新事务
REQUIRED_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须无事务,否则抛异常

我们常用为前两个

@Transactional
    @Override
    public void delete(Integer id) {
        try {//ctrl+alt+t
            deptMapper.deleteById(id);
            int i = 1 / 0;
            empMapper.deleteByDeptId(id);
        } finally {
            DeptLog deptLog = new DeptLog();
            deptLog.setCreateTime(LocalDateTime.now());
            deptLog.setDescription("执行解散部门的操作,这次解散的是" + id + "号部门");
            deptLogService.insert(deptLog);
        }
    }

此处我们创建事务调用了deptLogService中的insert方法

@Service
public class DeptLogServiceImpl implements DeptLogService {
    @Autowired
    private DeptLogMapper deptLogMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void insert(DeptLog deptLog) {
        deptLogMapper.insert(deptLog);
    }
}

在insert方法中,我们指定要创建一个新的事务,即执行propagation.Propagation.REQUIRES_NEW

因为如果按照默认值,我们delete方法和insert方法将会进入一个事务中,只要delete方法中有异常,那么insert方法中所做的操作也将被回滚,这是我们不愿意看到的。因此为insert指定新的事务。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值