- 该应用程序在 Spring + hibernate 中。
- 它有一个更新来自 3 个模式的 mysql 表的过程。
- 每个模式都有不同的数据源、会话工厂和事务管理器。
- 我有 3 个 DAO 类在它们各自的模式表上执行数据库操作。
- 由于所有数据库操作都应该在一个事务下,我从一个服务方法调用这些 dao 方法。
但问题是我不知道如何注释这个服务方法@Transactional
。事务注释只接受一个事务管理器,但我有 3 个。我的方法错了吗?我该如何解决这个问题?
但问题是我不知道如何注释这个服务方法@Transactional
。事务注释只接受一个事务管理器,但我有 3 个。我的方法错了吗?我该如何解决这个问题?
如果您需要协调多个事务资源,那么我认为您唯一的选择是使用带有 JTA 的分布式事务管理。 本文解释了如何配置 Spring 以使用 JTA 事务管理器。
在做了一些研究之后,如果您的三个数据源真的只是指向由同一台服务器托管的不同模式(与 mysql 中的数据库相同),那么您似乎有一个更好的选择。如果是这种情况,并且您有一个用于所有三个连接的用户,那么您基本上可以将它们合并到一个连接中,并@Table
在您的实体上使用注释来指定它们所属的架构,例如:@Table(schema = "schemaX")
.
可以这样做是因为连接 URL 中给出的数据库名称仅指定了默认数据库(请参阅doc),但您仍然可以执行 SQL 语句,用其他数据库名称限定表名,这正是@Table
注解导致 Hibernate 的原因。
现在拥有一个单一连接解决了您最初的问题,即在来自不同模式的表中进行原子更新。