事务
事务是一组操作的集合,它是一个不可分割的单位,这些操作要么成功,要么失败。
操作
- 开启事务(一组操作开始前,开启事务):start tranasction / begin ;
- 提交事务(这组操作全部成功,提交事务):commit
- 回滚事务(中间任何一个操作出现异常,回滚事务):rollback
一、Spring 事务管理
当涉及多表连接的时候,需要用到@Transaction,一般情况下用在方法中
# 开启事务管理日志
logging:
level:
org.springframework.jdbc.support.jdbcTransactionManager: debug
* 注解: @Transactional
* 位置: 业务(service)层的方法上、类上、接口上
* 作用: 将当前方法交给spring进行事务管理,执行方法前,开启事务;一、成功执行完毕,提交事务;二、出现异常,回滚事务
// 方法
@Transactional
@Override
public void delete(Integer id) {
deptMapper.deleteById(id);
int i = 1 / 0; // 模拟抛出异常
empMapper.deleteById(id);
}
// 接口
@Transactional
public interface DeptService {}
// 类
@Service
public class DeptServiceImpl implements DeptService {}
在spring框架当中就已经把事务控制的代码都已经封装好了,并不需要我们手动实现。我们使用了spring框架,我们只需要通过一个简单的注解@Transactional就搞定了。
Transactional 注解
@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。
@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。
二、事务进阶
1. 事务属性-回滚 RollbackFor
- 默认情况下,只有出现RuntimeException才会回滚异常。rollbackFor属性用于控制出现任何异常类型,回滚事务
@Transactional(rollbackFor = Exception.class) // 出现所有异常,进行事务回滚(Exception.class 可修改)
@Override
public void delete(Integer id) throws Exception {
deptMapper.deleteById(id);
if(true) {
throw new Exception("出错....");
}
empMapper.deleteById(id);
}
2. 事务属性-传播行为 Propagation
事务传播行为:指的是当一个事务方法被另一个事务调用时,这个事务方法应该如何进行事务控制
@Transactional
public void a() {
// ...
userservice.b();
// ...
}
@Transactional(propagetion = Propagation.REQUIRED) // 若有事务,则加入事务,若无则创建新事物(默认情况,定不定义都默认)
public void b() {
// ...
}
标签:事务管理,回滚,Spring,Transactional,事务,id,public From: https://www.cnblogs.com/bobowww/p/17574906.html
- REQUIRED:大部分情况下都是用该传播行为
- REQUIRES_NEW:当我们不希望事物之间相互影响时,考研使用该传播行为。比如:下订单前需要记录日志,无论订单保存成功与否,都需要保证日志记录成功