【问题标题】:find transaction id of spring @Transactional查找 spring @Transactional 的事务 id
【发布时间】:2019-05-20 18:59:19
【问题描述】:

我正在使用@Transactional 来管理事务

  @Override
  @Transactional
  public List<FooBo> save(Foo foo, Foo foo2) {
    logger.debug(() -> String.format("FooService.save()"));
    repository.save(foo);
    return repository1.save(foo2);
  }

我在使用TransactionAspectSupport.currentTransactionInfo()时找不到交易ID

还有其他方法吗? (如果 Spring 维护事务的唯一 ID)

更新: 我的场景是我想根据事务 id 在静态上下文中放置一些信息。在事务提交之后需要该信息。

例如 ..基于事务ID,我想将一些对象放在静态上下文中的map中,提交后需要利用这些对象..这就是我的想法

【问题讨论】:

  • 什么是交易 ID?
  • @AlanHay 我假设每笔交易都有其唯一的 ID。我需要跟踪每笔交易。
  • 为什么需要跟踪交易?你的用例是什么。这里。 Spring 不会生成任何东西,而是将其留给底层的 tx 解决方案。
  • @M.Deinum 我已经更新了我的问题。谢谢
  • @akuma8 ,但多线程是一样的。如果我使用它在静态上下文中保存一些信息,显然对于多线程,结果将是错误的

标签: spring-boot spring-transactions


【解决方案1】:

您可能这样做的唯一方法是通过 Spring Application Context 获取事务管理器并使用包含您可以控制的自定义 ID 的新 TransactionDefinition 调用 getTransaction() 在方法中自己创建事务.然后,您就可以使用刚刚为您的逻辑设置的 ID,但您只需在完成后手动 commit()rollback() 进行交易

【讨论】:

  • 什么是 TransactionDefinition“您可以控制的自定义 ID”?我找不到与该描述匹配的任何类属性
【解决方案2】:

我和你有类似的问题,看到没有解决方案,可能的工作是每个 Spring 事务都绑定到一个线程,所以使用线程本地存储,或者使用唯一的线程 ID 作为键. 对于这些解决方案,您必须确保在提交时,将从线程本地存储中清除 TX 特定信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2021-09-25
    • 2015-07-19
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多