代码之家  ›  专栏  ›  技术社区  ›  Teddy Dong

Doobie for Scala/Play框架的事务处理

  •  1
  • Teddy Dong  · 技术社区  · 4 年前

    我有一个关于doobie交易的问题。 我查看了这里的文档,看起来它一次只能处理一个查询?

    有可能有这样的东西吗

    sql'''
    begin;
    select * from table where id=1 for update;
    update table set id=2 where tabletest=2;
    commit'''
    

    任何人都可以向我提供任何想法或更多示例/文档,我们将不胜感激!非常感谢。

    0 回复  |  直到 4 年前
        1
  •  1
  •   Mateusz Kubuszok    4 年前

    当您应用 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 ( 我如何在同一笔交易中做几件事? )特别是。