我使用Clojure和JDBC在响应事件时从两个不同的数据库(特别是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处理此操作的方法?
答案 0 :(得分:4)
事务是数据库提供的行为,而不是您用于从数据库发送/检索数据的编程语言。所以,答案是你不能拥有真实的"因为没有办法协调2个数据库。
(perform mysql tx) if (successful) then (do vertica tx)
(do tx in DB 1) (try (do tx is DB 2) (catch Exception ex (rollback tx in DB 1)))
然而,这是次优的,因为您现在正在自己编写一个自己开发的DB插件,而不是利用DB的内置稳定性&可靠性(即如果在catch子句完成运行之前出现问题会怎么样?)。