服务方法的事务管理器,对来自多个模式的表执行数据库操作

时间:2013-03-26 16:00:47

标签: java spring hibernate transactions

  • 应用程序在Spring + hibernate中。
  • 它有一个进程,来自3个模式的mysql表得到更新。
  • 我有不同的dataSources,sessionFactories和 每个模式的transactionManagers。
  • 我有3个DAO类在各自执行数据库操作 架构表。
  • 由于所有数据库操作都应该在一个单独的操作中 事务,我从一种服务方法调用那些dao方法。

但问题是我不知道如何注释这个服务方法@Transactional。 Transactional annotation只接受一个事务管理器,但我有3个。 我的方法有误吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

如果您需要协调多个事务资源,那么我认为您唯一的选择是使用JTA进行分布式事务管理。 This article解释了如何配置Spring以使用JTA事务管理器。

编辑:

在做了一些研究之后,如果你的三个数据源真的只是指向同一服务器托管的不同模式(与mysql中的数据库相同),那么你似乎有了更好的选择。如果是这种情况,并且您有一个用于所有三个连接的用户,那么您基本上可以将它们合并为一个连接,并在您的实体上使用@Table注释来指定它们所属的架构,例如:@Table(schema = "schemaX")

这可以做到,因为连接URL中给出的数据库名称只指定了默认数据库(请参阅doc),但您仍然可以执行使用其他数据库名称限定表名的SQL语句,这正是<{1}}注释导致Hibernate。

现在只有一个连接可以解决您在不同模式的表中进行原子更新的原始问题。