【问题标题】:Transactions in Doobie for Scala / Play FrameworkDoobie for Scala / Play 框架中的事务
【发布时间】:2021-02-13 10:29:54
【问题描述】:
我有一个关于 doobie 交易的问题。
我查看了这里的文档,看起来它一次只能处理一个查询?
有没有可能有这样的东西
sql'''
begin;
select * from table where id=1 for update;
update table set id=2 where tabletest=2;
commit'''
任何人都可以指出我的任何想法或更多示例/文档将不胜感激!谢谢!!
【问题讨论】:
标签:
scala
functional-programming
psql
scala-cats
doobie
【解决方案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,这是一个单子 - 您可以使用 Cats 中的所有单子/应用程序/函子操作 - flatMap、map、mapN、tupled 等- 将这些ConnectionIOs 组合成更大的ConnectionIOs,一旦你完成运行它们(你一直在构建查询,但到目前为止还没有执行它们!)与.transact(transactor) 到事务中计算的实际结果中. BEGIN-COMMIT-or-ROLLBACK 由 .transact(transactor) 处理,这就是你不自己写的原因。
请参见 Doobie documentation 和 FAQ(我如何在同一个事务中做几件事?)。