事务
概念
- 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
注意:默认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指定新的事务。