Doobie中针对Scala / Play Framework的交易

问题描述

我对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操作-flatMapmap,{{1 }},mapN等-将这些tupled组合成更大的ConnectionIO s,然后运行它们(您正在构建查询,但到目前为止尚未执行它们!)和ConnectionIO转换成交易中计算出的实际结果。 .transact(transactor)BEGIN-COMMIT-or-ROLLBACK处理,这就是为什么您不自己编写它的原因。

特别是与此Doobie documentation一起见FAQ如何在同一笔交易中完成几件事?)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...