Java @事务性(传播=传播。必需)

Java @事务性(传播=传播。必需),java,spring,annotations,Java,Spring,Annotations,如果有人能解释此注释的作用以及我们使用它的确切时间: @Transactional(propagation=Propagation.REQUIRED) 感谢当需要传播设置时,会为应用该设置的每个方法创建一个逻辑事务范围。每个这样的逻辑事务作用域都可以单独确定仅回滚状态,外部事务作用域在逻辑上独立于内部事务作用域。当然,如果是标准的必要行为,所有这些作用域都将映射到同一个物理事务。因此,内部事务作用域中设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您所期望的那样) 在Spring应用程

如果有人能解释此注释的作用以及我们使用它的确切时间:

@Transactional(propagation=Propagation.REQUIRED)

感谢

当需要传播设置时,会为应用该设置的每个方法创建一个逻辑事务范围。每个这样的逻辑事务作用域都可以单独确定仅回滚状态,外部事务作用域在逻辑上独立于内部事务作用域。当然,如果是标准的必要行为,所有这些作用域都将映射到同一个物理事务。因此,内部事务作用域中设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您所期望的那样)


在Spring应用程序中,如果您使用
启用基于注释的事务支持,并使用@Transactional(propagation=propagation.REQUIRED)注释任何类/方法,则Spring framework将启动事务并执行该方法并提交事务。如果发生任何运行时异常,则事务将回滚

实际上,propagation=propagation.REQUIRED是默认的传播级别,您不需要明确提及它


有关更多信息:

要了解事务管理所采用的各种事务设置和行为,如
必需的
隔离
等。您必须了解事务管理本身的基础知识


有关解释的更多信息,请阅读。

如果您需要非专业人士对本手册提供的使用说明以外的内容进行说明

考虑一下这个代码

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}
调用doSomething()时,它知道在执行之前必须在数据库上启动事务。如果此方法的调用方已启动事务,则此方法将在当前数据库连接上使用相同的物理事务

@Transactional
注释提供了一种方法,用于告知代码在执行时必须具有事务。如果没有它,它将无法运行,因此您可以在代码中假设数据库中不会有不完整的数据,或者在发生异常时必须清理某些内容


事务管理是一个相当复杂的主题,希望这个简化的答案能有所帮助

您读过吗?Propagation.REQUIRED是事务的默认传播模式,所以您不需要显式设置它。如果有人感兴趣,我发布了它是否使用基于代理的配置来声明和访问DAO层,DAO类中的方法也必须用@Transactional注释。如果您已将
@Transactional
添加到服务层,则无需再将
@Transactional
添加到该事务中调用的DAO方法中。If
doSomething()
调用另一个没有@transactional的嵌套方法。该事务是否也将应用于该调用方法?是的,只要使用同一线程执行嵌套方法(即,不显式创建新线程)。这是因为Spring事务使用ThreadLocal变量绑定到当前线程