postgresql – clojure.java.jdbc中的嵌套事务

postgresql – clojure.java.jdbc中的嵌套事务,第1张

概述我们有一个包含数百万条记录的表m1.我们想要生成一个表m2,其中包含m1中每条记录的计算结果. 我们目前运行如下: (jdbc/with-db-transaction [tx connection] (jdbc/query tx [(jdbc/prepare-statement (:connection tx) "select 我们有一个包含数百万条记录的表m1.我们想要生成一个表m2,其中包含m1中每条记录的计算结果.
我们目前运行如下:

(jdbc/with-db-transaction [tx connection]  (jdbc/query tx    [(jdbc/prepare-statement (:connection tx)                              "select * from m1"                              {:fetch-size 1000})]     {:result-set-fn (process! [tx result-set] ...)}))

过程!是

(defn process! [tx result-set]  (jdbc/with-db-transaction [tx tx]    (jdbc/insert-multi! tx :m2 [:m2_column]      (mapv (fn [r] [(calculate r)])         result-set))))

select查询使用游标并且懒惰地使用.请参阅:clojure.java.jdbc lazy query.这就是它被包装在外部事务中的原因.

问题:

> Postgres是否存在数百万条记录的(嵌套)交易? clojure.java.jdbc docs说嵌套交易被外部交易所吸收,所以实际上我们只有一笔交易.它是否正确?
>如果我们想要为插入创建单独的事务,那么使用与数据库的不同连接的解决方案是什么?我们已经使用了连接池,所以可能已经是这种情况了?

解决方法

nested transactions are absorbed by the outer one

这是完全正确的.您可以查看sources:这是我们已经在交易时执行的分支;正如您所看到的,func(表示带有事务宏的主体的函数)只是在没有其他设置的情况下被调用.

is the solution to use a different connection to the database?

使用clojure.java.jdbc这似乎是唯一的选择.只需通过你的游泳池而不是tx来处理!功能.问题是这些事务不再嵌套,因此如果内部事务提交和外部由于某种原因而失败,则内部事务将不会回滚.您可以使用raw JDBC and savepoints实现“嵌套事务行为”.

总结

以上是内存溢出为你收集整理的postgresql – clojure.java.jdbc中的嵌套事务全部内容,希望文章能够帮你解决postgresql – clojure.java.jdbc中的嵌套事务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存