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

@仅对一个方法执行事务

萧树
2023-03-14

我需要创建一个具有架构列表的@Scheduled方法,对于每个架构,从2个表中删除行。

    @Scheduled(fixedDelay = 10000)
public void scheduleFixedDelayTask() {
    List<String> presentSchemas = getPresentSchemas();
    for (String schema : presentSchemas) {
        deleteFromCustomerTables(schema);
    }
}

我将deleteFromCustomerTables定义为@Transactional(propagation=propagation.REQUIRES_NEW),并在其中使用EntityManager从2个表中删除行。

为了使其工作,我需要将@Transactional添加到计划FixedDelayTask,否则我会导致Transaction必备异常。

我的问题是,我不希望整个调度器都是@Transactional,如果一个模式出错,我不希望回滚所有模式。

我也尝试过没有@Transactional和:

    Session session = entityManager.unwrap(Session.class);
    Transaction t = session.beginTransaction();
    //exec delete
    t.commit();
    session.close();

但我仍然收到Transaction必需的异常。你有解决方案吗?

共有1个答案

潘意
2023-03-14
  • 您必须确保已将事务管理器配置为以下内容:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {

  @Bean
  @Primary
  public PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager();
  }
}
  • 您必须确保方法 deleteFromCustomerTables 不在同一组件中,如下所示:
@Component
class Component1 {
   void scheduleFixedDelayTask(){...}
}

@Component
class Component2 {
   void deleteFromCustomerTables(){...}
}
 

但是在非常高的级别上,Spring为类创建代理,这些类在类本身或成员上声明@Transactional。代理在运行时大多是不可见的。它为Spring提供了一种将方法调用之前,之后或周围的行为注入到被代理的对象中的方法。事务管理只是可以挂钩的行为的一个例子。安全检查是另一回事。您也可以为日志记录等内容提供自己的内容。因此,当您使用@Transactional对方法进行注释时,Spring会动态创建一个代理,该代理实现与要注释的类相同的接口。当客户端调用您的对象时,调用将被拦截,并通过代理机制注入行为。

 类似资料:
  • 在Liquibase论坛的一次讨论中,开发人员Nathan Voxland说Liquibase应该在每个变更集之后提交。我知道这是一个七年前的线程,所以从那以后可能发生了很多变化,但也许没有? 它应该在变更集之后提交。在大多数数据库上,addColumn也会自动提交。 changeSet标记的文档可以解释为“在changelog中的所有前提条件成功之后提交”,这与7年前的帖子相矛盾。 我有一个ma

  • 问题内容: 我熟悉其他语言的其他模拟库,例如Java中的Mockito,但是Python的库使我的生活变得混乱。 我有以下课程想测试。 在我的测试中,我想确保在执行时调用了,并使用正确的参数调用了它。我不想跑步,因为它会做危险的事情。 我完全不确定该如何开始。Mock的文档难以理解,而且我不确定该模拟什么或如何模拟它。 在单独保留功能的同时,如何模拟该功能? 问题答案: 我想你要找的是 这是小描述

  • 我不确定我错过了什么。我的自定义逻辑适用于我为目标指定的所有字符串属性,而不仅仅是一个。 图像映射器: 购物产品映射器: 生成的mapstruct类: 为什么描述字段也与toFullImagePath一起使用? 这个“@Mapping(target=“fullImagePath”,source=“thumbPath”)不应该指定我只想更改fullImagePath吗?

  • 最近,我们正在为我们的应用程序解决一个性能问题,该代码最初是基于Corda教程代码的M13版本构建的,我们遵循了Corda的版本,现在更新为V2.0。业务很简单,甲方以表单的形式上传一份包含一些元数据的合同文档,然后将此事务发送给乙方,我们在验证功能中定义了一些简单的条件,因此,通常事务将在没有任何手动操作的情况下完成。但如果我们在本地环境中这样做,这个过程大约需要3秒钟(一个2.9M附件),但当

  • 问题内容: 我正在一个Java应用程序中工作,我需要同时执行这两个查询(如Java中的Strings),并在出现错误的地方回滚事务。 更新 我创建了一个字符串,其中两个查询用注释建议分隔开 更新 我已经尝试了JDBC原子事务作为Java中的代码。我强迫第二个sql失败,但是即使我指定.setAutoCommit(false); dblink通过第一个查询影响了另一个数据库。我在没有dblink事务

  • 问题内容: 我该如何发出一个Ajax请求来从javascript 更新?我当前正在使用加载初始数据,但这会大大延迟初始页面加载。 我正在考虑使用HTML标记事件触发请求并更新数据表。 问题答案: 从 理论上讲 ,应该执行以下操作。 与 但是,由于某些原因不支持此功能。 以下工作有效,但从本质上讲这是一个hack。 如果碰巧使用了PrimeFaces,则可以将其with设置为。 或者,如果您使用的是