当前位置: 首页 > 知识库问答 >
问题:

链式事务注释的奇怪行为

麻茂材
2023-03-14

我不明白它是如何工作的 Spring的事务注释。所以我做了下一个测试,没有实际意义,但我它显示了我的问题:

public class TransactionalTest {
    public void noTransaction(){
        required();
    }

    @Transactional(propagation = Propagation.SUPPORTS)
    public void supports(){
        required();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void transaction(){
        required();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void required(){
        mandatory();
    }

    @Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.MANDATORY)
    public void mandatory(){
        doSomething();
    }

    private void doSomething(){
        //I don't feel like to do something.
    }
}

方法noTransaction支持对同一方法的transaction必需/code>)可以正常工作。其他两个返回消息No existing transaction found for transactions marked with propagation‘mandatory’。

但是如果一个非事务性方法调用一个事务性方法(用REQUIRED注释),它调用另一个用MANDATORY注释的事务性方法,它就会失败。

为什么会有这种行为,如何避免?我注释了所有调用跨偶然方法的方法,以防万一?

共有1个答案

上官斌
2023-03-14

如果您使用的是默认的AOP方法Spring Proxy AOP,则建议是通过用代理对象包装带注释的类来实现的,代理对象拦截并建议调用。当您使用这样的自调用时,您绕过了代理,建议不会得到应用。

如果你真的需要在自调用上应用建议,你需要使用AspectJ AOP,它实际上修改了有问题的类,而不是修饰它。

 类似资料:
  • 问题内容: 之间有什么区别? 在整个类中添加“ @Transactional”注释 为每个方法添加“ @Transactional”注释? 使用spring和Hibernate吗? 问题答案: 基本上,如果您用所有方法注释该类,则将是事务性的。如果您不这样做,则可以仅将其标注为所需的方法。此外,你可以为每个方法指定不同的属性,如,,,…

  • 我试图理解,为什么Netty SSL模式工作在奇怪的方式?此外,问题如下,当任何SSL客户端(https浏览器,使用ssl的java客户端,也任何ssl客户端应用程序)连接到Netty服务器时,我开始完整的消息,在那里我可以正确识别所使用的协议,但只要通道保持连接,任何下面的消息都有奇怪的结构,与非ssl模式不同。例如,当https浏览器连接到我的服务器时,MessageRec的方法: 我已使用P

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在go中编写了一个简单的UDP服务器。 当我这样做时,它会打印我发送给它的所有包裹。但是,当客户端停止运行时,它将停止传递到文件。 客户端是发送10k请求的简单程序。因此,在文件中,我大约有50%的已发送软件包。当我再次运行客户端时,文件会再次增长,直到客户端脚本完成。 服务器代码: 这是客户端代码: 问题答案: 如您所怀疑,由于UDP的性质,似乎 UDP数据包丢失 。由于UDP是无

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处