事务的传播行为

事务的传播行为

事务的传播行为有七种 (我从网上直接拷贝的话,大家可以结合下面的代码理解)
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方法的事务中)

事务的传播行为
事务的传播行为