当您应用
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
这是一个单子-你可以在那里使用Cats中的所有单子/应用程序/functor操作-
flatMap
,
map
,
mapN
,
tupled
等-将这些结合起来
连接IO
s变大
连接IO
s,完成后运行它们(您一直在构建查询,但到目前为止还没有执行它们!)
.transact(transactor)
转换为事务中计算的实际结果。
BEGIN-COMMIT-or-ROLLBACK
由该处理
.transact(交易者)
这就是为什么你不自己写。
请参阅
Doobie documentation
用这个
FAQ
(
我如何在同一笔交易中做几件事?
)特别是。