【问题标题】:Long running transactions in SlickSlick 中长时间运行的事务
【发布时间】:2018-05-28 10:59:19
【问题描述】:

我正在开发 akka-http/slick 网络服务,我需要在事务中执行以下操作:

  1. 在表格中插入一行
  2. 调用一些外部网络服务
  3. 提交事务

我需要调用的网络服务有时响应很慢(比如说大约 2 秒)。

我担心这可能会使 SQL 连接保持打开的时间过长,这会耗尽 Slick 的连接池并影响其他独立请求。 这是一种可能吗?或者 Slick 是否采取了一些措施来确保这个“空闲”的中间事务连接不会饿死池?

如果这是我应该担心的事情 - 我能做些什么来解决这个问题吗?

如果重要的话,我将 MySQL 与 TokuDB 一起使用。

【问题讨论】:

  • 有什么原因不能改变步骤1-2的顺序吗?
  • @igorpcholkin 是的。我正在调用该 Web 服务来创建要插入数据库的资源的子资源。所以我需要要么创建两者,要么不创建。因此,如果外部 Web 服务失败,我需要回滚我的事务。
  • 为什么不只是 1/创建你的资源,释放数据库查询 2/调用服务 3/对服务结果做出反应:如果它工作什么都不做,否则删除你在步骤 1 中创建的内容。(因为如果服务变慢,它肯定会耗尽你的游泳池)
  • 因为在第 1 步和第 3 步之间,数据库中有一个资源可能会被并行查询、删除或更新。同样的原因,当您想在两个账户之间转移资金时,您的银行不会 1/ 贷记账户 X,2/ 借记账户 Y,/3 如果上一步失败,则从账户 X 取回钱。所有操作都应该是以原子方式完成。
  • @SergGr 哦,我的错,我一定是看错了什么。我认为 Igor 是在建议重新排序,而根本不使用交易。回复:你的问题,我需要在数据库中插入一条记录,然后使用自动递增的 ID 将子资源 POST 到外部 web svc(如果 web svc 失败,则回滚所有内容)

标签: mysql database scala slick


【解决方案1】:

光滑的文档似乎说这将是一个问题。

事务的使用总是意味着一个固定的会话。

您可以使用withPinnedSession 强制使用单个会话,即使在等待非数据库计算时也保持现有会话打开。

发件人:http://slick.lightbend.com/doc/3.2.0/dbio.html#transactions-and-pinned-sessions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多