【发布时间】:2015-09-13 15:55:24
【问题描述】:
我正在使用带有 JDBC 的 Clojure 在响应事件时从两个不同的数据库(特别是 MySQL 和 Vertica)中选择和插入记录。我希望所有这些都发生在单个事务中,如果任一命令出现任何问题,可以回滚。
(defn handle-request
[request]
(jdbc/with-db-transaction [mysql-conn config/mysql-db-spec]
(jdbc/with-db-transaction [vertica-conn config/vertica-db-spec]
(let [record (query-some-data mysql-conn request)]
(update-some-data! mysql-conn record)
(insert-some-vertica-data! vertica-conn record)))))
我担心这会导致 Vertica 事务成功而不是 MySQL 事务的风险。处理此操作的最惯用的 Clojure 方式是什么?
【问题讨论】:
-
听起来你基本上想要2-phase XA transactions。 JTA 为分布式事务提供 Java API,但两个数据库都必须支持该协议,并且您必须在提供 JTA 事务管理器的应用程序服务器中运行,或者您必须嵌入自己的一个。 AFAIK,没有任何 Clojure 项目可以为您提供此功能。
-
Immutant 支持 2PC - immutant.org/documentation/current/apidoc/…
标签: java jdbc clojure transactions database-connection