问题描述
我对doobie中的交易有疑问。 我在这里查看了文档,看起来它一次只能处理一个查询?
是否可能有这样的东西
sql'''
begin;
select * from table where id=1 for update;
update table set id=2 where tabletest=2;
commit'''
任何人可以向我指出的任何想法或更多示例/文档,将不胜感激!谢谢!!
解决方法
当您应用Transactor
query.transact(transactor)
但这并不意味着您必须在一行中运行整个事务:
val operations = for {
myClass <- sql"""SELECT a,b,c,FROM table_x WHERE ...""".query[MyClass].to[List]
updatedRows <- sql"""UPDATE table_x SET ... WHERE""".update.run
} yield someResult
operations.transact(transctor)
基本上,您将每个查询/更新都转换为ConnectionIO
,这是一个monad-您可以在此处使用Cats的所有monadic / applicative / functor操作-flatMap
,map
,{{1 }},mapN
等-将这些tupled
组合成更大的ConnectionIO
s,然后运行它们(您正在构建查询,但到目前为止尚未执行它们!)和ConnectionIO
转换成交易中计算出的实际结果。 .transact(transactor)
由BEGIN-COMMIT-or-ROLLBACK
处理,这就是为什么您不自己编写它的原因。
特别是与此Doobie documentation一起见FAQ(如何在同一笔交易中完成几件事?)。