spring中事务传播行为有哪些

这篇文章给大家分享的是有关spring中事务传播行为有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达10年累计超上千家客户的网站建设总结了一套系统有效的推广解决方案,现已广泛运用于各行各业的客户,其中包括:阳光房等企业,备受客户表扬。

事务传播行为整理

spring 的七中传播行为

  • PROPAGATION_REQUIRED

    • 标识当前方法必须在事务中执行

  • PROPAGATION_SUPPORTS

    • 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

  • PROPAGATION_MANDATORY

    • 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

  • PROPAGATION_REQUIRES_NEW

    • 使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作为事务管理器。 它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。

  • PROPAGATION_NOT_SUPPORTED

    • PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

  • PROPAGATION_NEVER

    • 总是非事务地执行,如果存在一个活动事务,则抛出异常。

  • PROPAGATION_NESTED

    • 如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

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中事务传播行为有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


本文题目:spring中事务传播行为有哪些
网页地址:http://pwwzsj.com/article/igpdop.html