Mic*_*ent 4 postgresql jdbc clojure
我们有一张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] ...)}))
Run Code Online (Sandbox Code Playgroud)
这里process!
是
(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))))
Run Code Online (Sandbox Code Playgroud)
该select
查询使用游标并懒洋洋地消耗掉.请参阅:clojure.java.jdbc延迟查询.这就是它被包装在外部事务中的原因.
问题:
嵌套事务被外部事务吸收
这是完全正确的.您可以查看来源:这是我们已经在交易时执行的分支; 正如您所看到的,func
(表示with-transaction
宏体的函数)只是在没有其他设置的情况下调用.
是使用不同的数据库连接的解决方案?
有了clojure.java.jdbc
这似乎是唯一的选择.只是通过你的游泳池,而不是tx
来process!
发挥作用.问题是这些事务不再嵌套,因此如果内部事务提交和外部由于某种原因而失败,则内部事务将不会回滚.您可以使用原始JDBC和保存点实现"嵌套事务行为" .
归档时间: |
|
查看次数: |
733 次 |
最近记录: |