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

外行术语的春季传播示例

段干恺
2023-03-14
问题内容

Spring文档在描述事务传播属性方面做得非常出色。

但是,我想知道是否有可用的众所周知的真实示例以通俗易懂的方式更全面地描述每个属性?


问题答案:

PROPAGATION_REQUIRED

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

如果调用者尚未启动 事务, 则在调用 doSomething()时它将启动新 事务

如果此html" target="_blank">方法的调用者已经开始事务,则使用调用者的事务,并且不会创建新的事务(即,正在运行一个事务)。

如果在doSomething()中引发了异常,则它将被回滚,这意味着调用方还将看到事务回滚。

当doSomething()返回时,事务尚未提交。调用者将提交事务(或可能回滚)。

PROPAGATION_REQUIRES_NEW

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}

调用doSomething()时,它将 始终 启动新事务。

如果此方法的调用者已经启动了事务(TxnOuter),则调用者的事务将被 挂起, 并创建一个新事务(TxnInner)(即,正在运行两个事务)。

如果在doSomething()中引发异常,则TxnInner将回滚,但是来自调用方(TxnOuter)的“挂起”事务不受影响。

当doSomething()返回无异常时,它将提交事务(TxnInner)。调用者的事务(TxnOuter)将恢复,并且不知道已提交另一个事务。然后,调用方可以根据需要提交或回退TxnOuter。

需要注意的重要一点是,数据库将TxnOuter和TxnInner视为完全独立的事务,因此将其视为两个独立的提交。

PROPAGATION_NESTED

class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}

如果您的JDBC驱动程序和/或数据库支持JDBC保存点,则只能使用NESTED。

如果调用者尚未启动 事务, 则在调用 doSomething()时它将启动新 事务

如果此方法的调用者已经开始事务,则使用调用者的事务,并且不会创建新的事务(即,正在运行一个事务)。但是,当输入doSomething()时,会在事务上标记一个“保存点”。

如果在doSomething()中引发了异常,则可以将事务部分回滚到“保存点”。呼叫者将继续进行交易。

当doSomething()返回无异常时,调用者将提交整个事务(或回滚)。

需要注意的重要一点是,数据库仅查看一个事务,并且只有一个提交。



 类似资料:
  • Spring文档在描述事务传播属性方面做得非常出色。 然而,我想知道是否有任何已知的、真实的例子可以用外行的术语更全面地描述这些属性?

  • 问题内容: 有人可以用简单的术语解释ProxyFactoryBean吗? 我看到很多地方都引用了它。 问题答案: 用于将拦截器逻辑应用于现有目标Bean,以便在调用该Bean上的方法时,拦截器在该方法调用之前和之后执行。这是面向方面的编程(AOP)的示例。 最好用一个简单的例子来解释。AOP的经典用例是将缓存应用于方法调用的结果。可以使用以下方式进行连接: 我们有一个类型为bean 的类型,它实现

  • 问题内容: 我有一个Java应用程序,它从主类开始(不是Spring Boot应用程序)。而且我想使用Spring retry在连接丢失时重试。据我所知,我需要在Spring应用程序的主类之上添加@EnableRetry批注,然后在我的方法之上使用@Retryable进行重试。但是我认为这在非​​Spring应用程序中将不起作用。是否可以在简单的Java应用程序(而非spring应用程序)中使用s

  • 问题内容: 我如何让Spring从中加载Hibernate的属性? 我们正在使用Spring和JPA(以Hibernate作为实现)。Spring 指定了JPA语言和Hibernate属性: 在这种配置中,Spring通过applicationContext.xml读取所有的Hibernate属性。当我创建一个(位于我的类路径的根目录,与META- INF处于同一级别)时,Hibernate根本不

  • 问题内容: 总的来说,我对Web上的Spring和Java还是很陌生,但是周末我一直在为此苦苦挣扎。将所有配置整合在一起并使Spring在IntelliJ上与gradle一起使用是一个挑战。 我正在尝试在Spring中实施另一个项目,以便更好地了解如何使用它。 我整个上午都在收到此错误,并且在Spring上浏览了许多参考资料和指南,但看不到问题出在哪里。 由以下原因引起:org.springfra

  • 问题内容: 我已经拥有一个Azure Web App服务和一个SQL数据库。我正在使用Azures Intellij插件来“在Web App上运行”。问题是,它什么也没运行,但是确实将罐子放在文件夹中: 然后,我使用控制台尝试通过使用来运行,但收到错误消息 Java不被识别为内部命令或外部命令 在webapp应用程序设置中,我假设它可以让我运行Java,但这只是让我怀疑我的操作方式。我部署应用程序