spring事务的传播机制

spring事务的传播机制

1.require(默认)

作用:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。

场景:大多数业务方法都使用此传播行为。

解释:如果 methodA 调用 methodB,则 methodB 会加入 methodA 的事务。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // 业务逻辑
}

2.requires_new

作用:无论当前是否存在事务,都创建一个新事务。如果当前存在事务,则挂起当前事务。

场景:需要独立事务的方法,例如日志记录。

解释:如果 methodA 调用 methodB,则 methodB 会启动一个新事务,methodA 的事务会被挂起。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB(); // methodB 会启动一个新事务
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // 业务逻辑
}

3.supports

作用:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

场景:方法可以支持事务,但不强制要求事务

解释:如果 methodA 调用 methodB,则 methodB 会加入 methodA 的事务;如果 methodB 被单独调用,则以非事务方式执行。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB(); // methodB 会加入 methodA 的事务
}

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // 业务逻辑
}

4.not_supported

作用:以非事务方式执行操作。如果当前存在事务,则挂起当前事务。

场景:不需要事务支持的方法。

解释:如果 methodA 调用 methodB,则 methodB 会以非事务方式执行,methodA 的事务会被挂起。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB(); // methodB 会以非事务方式执行
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
    // 业务逻辑
}

5.mandatory(强制的)

作用:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

场景:强制要求调用方必须有事务。

解释:如果 methodA 调用 methodB,则 methodB 会加入 methodA 的事务;如果 methodB 被单独调用且没有事务,则会抛出异常。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB(); // methodB 会加入 methodA 的事务
}

@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // 业务逻辑
}

6.never

作用:以非事务方式执行操作。如果当前存在事务,则抛出异常。

场景:强制要求调用方不能有事务

解释:如果 methodA 调用 methodB,且 methodA 没有事务,则 methodB 会以非事务方式执行;如果 methodA 有事务,则会抛出异常

public void methodA() {
    // 业务逻辑
    methodB(); // methodB 会以非事务方式执行
}

@Transactional(propagation = Propagation.NEVER)
public void methodB() {
    // 业务逻辑
}

7.nested(嵌套)

作用:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务

场景:需要部分回滚的场景。

解释:如果 methodA 调用 methodB,则 methodB 会在 methodA 的事务中创建一个嵌套事务。如果 methodB 回滚,则只会回滚 methodB 的操作,而不会影响 methodA 的事务。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // 业务逻辑
    methodB(); // methodB 会在嵌套事务中执行
}

@Transactional(propagation = Propagation.NESTED)
public void methodB() {
    // 业务逻辑
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇