这篇文章给大家分享的是有关spring中事务传播行为有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
事务传播行为整理
spring 的七中传播行为
PROPAGATION_REQUIRED
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// do something
}
(1)调用methodB,因为当前上下文中没有事务,所以会新建一个事务。
(2)调用methodA,因为当前上下文中没有事务,所以会新建一个事务。但是,当执行到methodB时,方法B会被加入到methodA的事务中。
PROPAGATION_SUPPORTS
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事务属性为SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// do something
}
(1) 调用methodB,则以非事务的方法执行。
(2) 调用methodA,上下文没有事务,新建一个,而执行到methodB时,它自动加入到methodA的事务中。
PROPAGATION_MANDATORY
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事务属性为MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// do something
(1) 调用methodB时,上下文中没有事务,则会抛出异常。
(2) 调用methodA,上下文没有事务,新建一个,而执行到methodB时,它自动加入到methodA的事务中。
PROPAGATION_REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
doSomeThingA();
methodB();
doSomeThingB();
// do something else
}
// 事务属性为REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// do something
}
(1) 调用methodB会开启一个新的事务。
(2) 调用methodA时,methodA会开启事务,methodB也会开启一个新的事务,但是这两个事务互相独立。也就是说,如果methodA方法在调用methodB方法后的doSomeThingB方法失败了,而methodB方法所做的结果依然被提交。而除了 methodB之外的其它代码导致的结果却被回滚了
PROPAGATION_NOT_SUPPORTED
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
doSomeThingA();
methodB();
doSomeThingB();
// do something else
}
// 事务属性为PROPAGATION_NOT_SUPPORTED
@Transactional(propagation = Propagation.PROPAGATION_NOT_SUPPORTED)
public void methodB() {
// do something
}
(1) 执行methodB。无事务。
(2) 执行methodA。当执行到方法B时,事务会被挂起,以非事务的方式执行methodB,然后事务恢复。
也就是methodB中有异常时,B不回滚,A回滚。
PROPAGATION_NEVER
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事务属性为SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// do something
}
(1) 单独执行methodB, 非事务执行。
(2) 执行 methodA ,当执行到methodB时,会抛出异常。
PROPAGATION_NESTED
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
doSomeThingA();
methodB();
doSomeThingB();
// do something
}
// 事务属性为NEWSTED
@Transactional(propagation = Propagation.NEWSTED)
public void methodB() {
// do something
}
(1)单独执行methodB,则会开启一个事务。
(2)执行methodA,如果methodA的事务执行失败后,会回滚内部的methodB事务。但是,methodB事务执行失败后,并不会引起外层methodA事务的回滚。
感谢各位的阅读!关于“spring中事务传播行为有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!