如何解决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操作-flatMap
,map
,{{1 }},mapN
等-将这些tupled
组合成更大的ConnectionIO
s,然后运行它们(您正在构建查询,但到目前为止尚未执行它们!)和ConnectionIO
转换成交易中计算出的实际结果。 .transact(transactor)
由BEGIN-COMMIT-or-ROLLBACK
处理,这就是为什么您不自己编写它的原因。
特别是与此Doobie documentation一起见FAQ(如何在同一笔交易中完成几件事?)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。