【问题标题】:Using Spring @Transactional annotation使用 Spring @Transactional 注解
【发布时间】:2020-06-18 18:47:47
【问题描述】:

我有几个操作(服务调用,但我想这并不重要)我需要以原子方式运行。假设我有多次读写 DB 的操作 A、B 和 C,我需要:

  • B 查看 A 所做的 DB 更改(以及 C 查看 A 和 B 所做的更改)。这很重要,因为某些操作使用了之前操作的结果。
  • 在所有三个操作都完成并且事务作为一个整体提交(或者如果出现问题时回滚)之前,其他所有人(比如其他一些事务)看不到更改(例如,如果他们读取 DB)。这很重要,因为在这些操作全部完成之前,有问题的数据库表是不一致的。

我在想@Transactional(如下面的示例)正是我在这里需要的(具有正确配置的隔离等),但我不确定。我可以使用@Transactional 来解决这个问题吗?如果是,如何正确配置?谢谢。

@Transactional(...)
public void someTransactionalMethod(...) {
  callA();
  callB();
  callC();
}

P.S.:你可能会建议我尝试设计一些不同的东西(更好),但我担心这超出了可能的范围。我受到现有代码等的约束(例如,大多数这些操作的内部运作不在我的控制之下)。

【问题讨论】:

  • 除了将 \@Transactional 放在方法之上,无需任何其他配置,您无需执行任何其他操作。或者只是为了确保您可以使用 \@Transactional (isolation=Isolation.READ_COMMITTED)。原因是 spring 从数据库引擎中获取默认值。据我所知,对于大多数引擎来说,它是默认读取的,但检查一下是明智的。
  • @cool 我希望它会像那样简单。谢谢。

标签: java spring database spring-transactions acid


【解决方案1】:

显然@Transactional 正是我在这里所需要的。谢谢@酷

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2019-02-18
    • 2014-12-24
    • 1970-01-01
    • 2014-07-18
    • 2021-02-11
    • 1970-01-01
    • 2019-09-20
    • 2018-03-28
    相关资源
    最近更新 更多