1

我有一个关于 doobie 交易的问题。我查看了此处的文档,看起来它一次只能处理一个查询?

有没有可能有这样的东西

sql'''
begin;
select * from table where id=1 for update;
update table set id=2 where tabletest=2;
commit'''

任何人都可以指出我的任何想法或更多示例/文档将不胜感激!谢谢你!!

4

1 回答 1

1

当您应用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)这就是为什么你不自己写它。

请参阅Doobie 文档和此常见问题解答如何在同一事务中做几件事?)。

于 2020-10-31T16:03:45.653 回答