我有一个关于 doobie 交易的问题。我查看了此处的文档,看起来它一次只能处理一个查询?
有没有可能有这样的东西
sql'''
begin;
select * from table where id=1 for update;
update table set id=2 where tabletest=2;
commit'''
任何人都可以指出我的任何想法或更多示例/文档将不胜感激!谢谢你!!
我有一个关于 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
, mapN
,tupled
等 - 将这些ConnectionIO
s 组合成更大ConnectionIO
的 s ,一旦你完成运行它们(你有一直在构建查询,但到目前为止还没有执行它们!).transact(transactor)
在事务中计算的实际结果中。BEGIN-COMMIT-or-ROLLBACK
由那处理,.transact(transactor)
这就是为什么你不自己写它。