Mysql 锁定 3 个连续的相互依赖的查询
Mysql Locking 3 consecutive interdependent queries
抱歉,我没有真正的密码。但只是一个问题的解释。
我想了解解决此问题的最佳方法是什么。
我有 3 个查询:
- 第一个是长事务,它在 table.
中执行 SQL INSERT 语句
- 第二个查询在 INSERT 发生后 table 计算前一个
的行数
- 第三个查询用第二个查询检索到的计数更新先前插入记录的一个字段。
到目前为止一切顺利。我的 3 个查询已正确执行。
现在假设这 3 个查询是在 API 调用中执行的。现在发生的情况是,如果多个 API 调用同时执行得太快,第二个 COUNT 查询检索到一个错误的值,因此第三个 UPDATE 也有一个错误的值。
尽管如此,我在 INSERT 查询上遇到了死锁,因为在进行 INSERT 时,SELECT COUNT 试图在第二个 api 调用中同时读取。
我的问题是解决此类问题的最佳方法是什么。
我不需要代码。我只想了解最好的方法。
例如,我需要锁定所有 table 吗?
不清楚你在做什么,但这可能会更快:
CREATE TEMPORARY TABLE t ...; -- all columns except count
INSERT IN t ...; -- the incoming data
SELECT COUNT(*) INTO @ct FROM t;
INSERT INTO real_table
(...) -- including the count-column last
SELECT ..., @ct FROM t; -- Note how count is tacked on last
抱歉,我没有真正的密码。但只是一个问题的解释。 我想了解解决此问题的最佳方法是什么。 我有 3 个查询:
- 第一个是长事务,它在 table. 中执行 SQL INSERT 语句
- 第二个查询在 INSERT 发生后 table 计算前一个 的行数
- 第三个查询用第二个查询检索到的计数更新先前插入记录的一个字段。
到目前为止一切顺利。我的 3 个查询已正确执行。 现在假设这 3 个查询是在 API 调用中执行的。现在发生的情况是,如果多个 API 调用同时执行得太快,第二个 COUNT 查询检索到一个错误的值,因此第三个 UPDATE 也有一个错误的值。 尽管如此,我在 INSERT 查询上遇到了死锁,因为在进行 INSERT 时,SELECT COUNT 试图在第二个 api 调用中同时读取。
我的问题是解决此类问题的最佳方法是什么。 我不需要代码。我只想了解最好的方法。 例如,我需要锁定所有 table 吗?
不清楚你在做什么,但这可能会更快:
CREATE TEMPORARY TABLE t ...; -- all columns except count
INSERT IN t ...; -- the incoming data
SELECT COUNT(*) INTO @ct FROM t;
INSERT INTO real_table
(...) -- including the count-column last
SELECT ..., @ct FROM t; -- Note how count is tacked on last