【问题标题】: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 中的所有单子/应用程序/函子操作 - flatMapmapmapNtupled 等- 将这些ConnectionIOs 组合成更大的ConnectionIOs,一旦你完成运行它们(你一直在构建查询,但到目前为止还没有执行它们!)与.transact(transactor) 到事务中计算的实际结果中. BEGIN-COMMIT-or-ROLLBACK.transact(transactor) 处理,这就是你不自己写的原因。

    请参见 Doobie documentationFAQ我如何在同一个事务中做几件事?)。

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2013-05-27
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      相关资源
      最近更新 更多