java - 一个应用程序中有多个 Spring @Transactional 注释?

标签 java spring database-connection spring-annotations transactional

在我的应用程序中,我有几个关于不同方法的 @Transactional 注释。

他们使用 Crud Repository 对我的数据库执行删除操作。我想知道在什么阶段执行这些删除,我是否需要所有的 @Transactional 注释?

例如,2删除methods之后在façade方法中调用,然后在runner中调用façade方法:

<强>1。方法一:

@Transactional
public void deleteFromSchemaOne(){

}

<强>1。方法二:

@Transactional
public void deleteFromSchemaTwo(){

}

<强>2。在外观方法中调用这 2 个方法:

@Transacational
public void deleteFromAllSchemas(){

deleteFromSchemaOne();
deleteFromSchemaTwo();

}

<强>3。在runner中调用façade方法

@Transactional
    public void run(String... args) throws Exception {

        service.deleteFromAllSchemas();


}

我想知道的是:

我的删除实际上将在哪个阶段执行?是否会在 Runner 中完成方法时?

编辑:

带循环的外观方法:

public void deleteFromAllSchemas() {

    for(int i = 0; i < list.size(); i++){

     deleteFromSchemaOne();
     deleteFromSchemaTwo();

    }

最佳答案

当最外层事务完成时,所以在 run() 之后。 实际上它不是最外层的,它是唯一的交易。内部 @Transactionals 不会创建新事务,它们只是加入现有事务。

如果您需要确保甚至在外部事务完成之前提交某些更改,您需要使用 @Transactional(propagation=Propagation.REQUIRES_NEW) 设置事务的传播。这将创建一个新的交易,即使已经存在一个交易也是如此。

在您的示例代码中(至少基于它现在包含的内容),run() 方法可能甚至不应该启动事务。

如果我没理解错的话,你想要的是

public void run() {
    for(int i = 0;i < list.size(); i++)
        service.deleteFromAllSchemas(i);
}

@Transactional
public void deleteFromAllSchemas(int i) {
    deleteFromSchemaOne(i);
    deleteFromSchemaTwo(i);
}

关于java - 一个应用程序中有多个 Spring @Transactional 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296813/

相关文章:

java - 目前,您会使用 JBoss 或 Glassfish(或其他)作为新项目的 Java EE 服务器吗?

java - 更改 spring petclinic 中根目录的名称

java - 使用 Hibernate Validator 在错误消息中包含字段名称

Java MYSQL错误连接关闭后不允许进行任何操作

MySQL - 持久连接与连接池

java - 使用 apache POI 按值合并动态单元格

Java UTF-16编码代码

java - 使用 Maven Bundle 插件进行 osgi 开发并设置依赖关系

java - AKKA - Spring MVC 和服务 - 超时异常

linux - 在 Linux 中使用 smb 查询 mdb(ms Access )文件的最简单选项