我有一个关于 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等 - 将这些ConnectionIOs 组合成更大ConnectionIO的 s ,一旦你完成运行它们(你有一直在构建查询,但到目前为止还没有执行它们!).transact(transactor)在事务中计算的实际结果中。BEGIN-COMMIT-or-ROLLBACK由那处理,.transact(transactor)这就是为什么你不自己写它。