事务的传播行为
事务的传播行为有七种 (我从网上直接拷贝的话,大家可以结合下面的代码理解)
PROPAGATION.REQUIRED-------- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION.SUPPORTS --------支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION.MANDATORY -------------支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION.REQUIRES NEW ---------- 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION.NOT_SUPPORTED ---------以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION.NEVER -------------- 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION.NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务。
通过代码讲解传播行为
1、创建日志表
CREATE TABLE `logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`log` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、创建logDao和logService
@Repository
public class LogDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 插入日志信息到数据库种
*/
public void recordLog(){
String sql = "insert into logs(log) values(?)";
jdbcTemplate.update(sql,UUID.randomUUID().randomUUID().toString());
}
}
@Service
public class LogService {
@Autowired
private LogDao logDao;
public void recordLog(){
logDao.recordLog();
System.out.println("记录日志成功!");
}
}
由于不好演示,只能结果先预测讲解
1、PROPAGATION.REQUIRED(默认的事务传播行为)
2、PROPAGATION.REQUIRES_NEW(会创建新的事务)
3、PROPAGATION.SUPPORTS(可以共用一个事务,如果没有事务,也不会创建)
第一种情况:有默认事务
第二种情况:save方法种没有事务
4、PROPAGATION.NOT_SUPPORTED(因为它不支持事务,所以即使有事务,它不会共用事务)
5、PROPAGATION.MANDATORY(它会共用事务,如果没有事务共用会抛出异常)
6、PROPAGATION.NEVER(它不支持事务,如果方法中有事务的存在,它反而会抛出异常)
7、PROPAGATION.NESTED(它自己存在事务,如果save方法中有事务的存在,则它会将自己的事务嵌套在save方法的事务中)