REQUIRED
首先看看Spring官方的源码
中文解释:支持当前事务,如果当前没有事务,则创建一个新的事务。
/**
* insertDepartment方法使用事务,insertEmployee方法不使用事务,
* 假设在insertDepartment中调用insertEmployee方法,
* insertEmployee方法也会包含事务,出现异常会回滚。
* 假设在insertEmployee中调用insertDepartment方法,
* 因为insertEmployee没有事务,所以insertDepartment会自己新建一个事务
*/
@Transactional(propagation = Propagation.REQUIRED)
public void insertDepartment() {
//TODO
}
public void insertEmployee() {
//TODO
}
SUPPORTS
老规矩,先上源码
中文翻译:支持当前事务,如果当前不存在事务,则不使用事务。
/**
* 如果在insertDepartment中包含事务,并且调用了insertEmployee,
* 即当前存在事务,则insertEmployee会加入当前事务
*/
@Transactional(propagation = Propagation.REQUIRED)
public void insertDepartment() {
insertEmployee();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void insertEmployee() {
//TODO
}
/**
* 如果在insertDepartment中不包含事务
* 即当前不存在事务,则insertEmployee不使用事务
*/
public void insertDepartment() {
insertEmployee();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void insertEmployee() {
//TODO
}
MANDATORY
老规矩,先上源码
中文翻译:支持当前事务,如果当前不存在事务,则抛出异常。
使用该注解,方法本身不创建事务,调用其的父方法必须包含事务,如果不包含事务就撂挑子不干。
/**
* insertDepartment方法必须包含事务,不管是使用上面的SUPPORTS继承事务,
* 还是使用REQUIRED继承事务或自己新建事务。如果不包含事务,insertEmployee会抛出异常。
*/
@Transactional(propagation = Propagation.REQUIRED)
public void insertDepartment() {
//TODO
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertEmployee() {
//TODO
}
/**
* insertEmployee会抛出异常。
*/
public void insertDepartment() {
//TODO
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertEmployee() {
//TODO
}
REQUIRES_NEW
老规矩,先上源码康康
中文翻译:创建一个新的事务,如果当前存在事务,则暂停(挂起)当前的事务。
/**
* insertDepartment中包含事务
* insertEmployee执行时会将当前事务挂起,新建一个事务
*/
@Transactional(propagation = Propagation.REQUIRES)
public void insertDepartment() {
insertEmployee();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertEmployee() {
//TODO
}
NOT_SUPPORTED
老规矩,先上源码康康
中文翻译:以无事务方式执行,如果当前有事务,则暂停(挂起)当前事务。
NEVER
老规矩,先上源码康康
中文翻译:以无事务的方式执行,如果当前存在事务,则抛出异常。
/**
* 调用insertEmployee方法的父方法不可以包含事务,
* 如果使用了事务,insertEmployee方法会抛出异常
*/
//@Transactional(propagation = Propagation.REQUIRES)
public void insertDepartment() {
insertEmployee();
}
@Transactional(propagation = Propagation.NEVER)
public void insertEmployee() {
//TODO
}
NESTED
老规矩,先上源码康康
中文翻译:如果当前有事务,以嵌套事务(子事务)的方式执行,嵌套事务独立提交或回滚。
如果当前没有事务,则当作REQUIRES执行。
/**
* 主事务(insertDepartment)提交或回滚,子事务(insertEmployee)也会强制提交或回滚。
* 但子事务提交或回滚,主事务可以通过捕捉异常等方法选择是否回滚。
*/
//@Transactional(propagation = Propagation.REQUIRES)
public void insertDepartment() {
insertEmployee();
}
@Transactional(propagation = Propagation.NESTED)
public void insertEmployee() {
//TODO
}
感写你的观看,我们下回再见!