当前位置: 首页 > 面试题库 >

Spring @Transactional批注:自我调用

元修然
2023-03-14
问题内容

我知道从同一个类内部调用事务方法时,它不会在事务中运行。Spring为事务方法创建代理,并将它们包装在try-
catch块中,如果发生异常,则回滚。请考虑以下情形:

@Transactional
public void saveAB(A a, B b)
{
    saveA(a);
    saveB(b);
}

@Transactional
public void saveA(A a)
{
    dao.saveA(a);
}

@Transactional
public void saveB(B b)
{
    dao.saveB(b);
}

假设saveAB已从另一个对象调用,并且中发生了异常saveB,因此saveA成功完成但未成功saveB。据我所知,尽管saveA并且saveB不是事务性的(因为它们是从同一个对象中调用的),但由于saveAB它是事务性的,因此仍应回滚。

我不明白的是,为什么人们说自我调用会破坏交易?只要调用方方法是事务性的,所有的事情就不应该按预期工作吗?我在这里想念什么吗?


问题答案:

我不明白的是,为什么人们说自我调用会破坏交易?

我从未听说过自调用会中断事务。我所知道的是,自调用不会启动新事务,您已经提到了原因。

Spring交易管理规范的摘录

注意
在代理模式(默认设置)下,仅拦截通过代理传入的外部方法调用。这意味着,实际上,即使被调用的方法标有@Transactional,自调用实际上也不会导致运行时实际事务在目标对象中调用目标对象的另一种方法。

如果@Transaction从中删除注释saveAB(),则将观察该方法saveA()saveB()即使使用注释,也不会在事务下运行@Transactional。但是,如果您在类外部调用saveA()saveB()从类外部调用,它将按预期在事务下运行。这就是为什么人们建议对自调用要谨慎的原因。

public void saveAB(A a, B b)
{
    saveA(a);
    saveB(b);
}

@Transactional
public void saveA(A a)
{
    dao.saveA(a);
}

@Transactional
public void saveB(B b)
{
    dao.saveB(b);
}

我认为,自行调用任何公共方法都是一个坏主意。



 类似资料:
  • 我不明白的是为什么人们说自我调用会破坏交易?只要调用方方法是事务性的,难道一切都不应该像预期的那样工作吗?我有什么遗漏吗?

  • 问题内容: 我正在阅读使用Spring框架进行的事务管理。在第一个组合中,我使用了Spring + hiberante,并使用了Hibernate的API来控制事务(Hibenate API)。接下来,我想使用注释进行测试,它确实起作用。 我对此感到困惑: JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使

  • 问题内容: 这与Spring 在服务层上使用 注释有关。 我经历了很多关于此的堆栈溢出问题,但是仍然对是否应该避免使用感到困惑。 如果有人帮助我找出以下查询的答案,那将是很大的帮助。 在具有复杂模式的应用程序中使用是不好的做法。 使用此过滤器可能会导致问题 如果我们正在使用,是否意味着不需要? 下面是我的Spring配置文件 问题答案: 是一个servlet过滤器,而不仅仅是打开一个hiberna

  • 问题内容: 我仍在尝试围绕@Transactional的工作原理。 我在Service类的方法上有注释,而在Repository类中的方法上有注释。带注释的方法是否适用于带注释的存储库中的方法? 我的理解: 在没有数据的类的方法上,将数据写入数据库,而使用时,则将数据写入数据库。 修改查询 修改方法签名只能返回,或者 更新查询必须是事务性的,标记为 Spring Data将删除所有未刷新的未处理更

  • 问题内容: 我正在使用Spring注释来管理我的事务,如下所示: 我想知道如果忘记注释会发生什么: 当alertDAO实现如下时: 似乎Hibernate允许我从数据库中获取数据,即使没有注释也是如此。 这种粗心大意的后果是什么?可能发生的最坏情况是什么? 问题答案: 根据文档(Spring docs ),它仅仅是元数据,它表明方法或接口可以由“具有交易意识的”事物(例如)进行配置。 相信只有 t

  • 主要内容:1.@Transactional 失败的情况,2.@Transactional 源码分析,3.@Transactional 失效原因1.@Transactional 失败的情况 UserDao UserController @Transactional 事务不生效的几种情况 类内部访问:A 类的 a1 方法没有标注 @Transactional,a2 方法标注 @Transactional,在 a1 里面调用 a2; 私有方法:将 @Transactional 注解标注在非 publi