【发布时间】:2018-05-28 10:59:19
【问题描述】:
我正在开发 akka-http/slick 网络服务,我需要在事务中执行以下操作:
- 在表格中插入一行
- 调用一些外部网络服务
- 提交事务
我需要调用的网络服务有时响应很慢(比如说大约 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