0

我有一个相当基本的查询:

UPDATE the_table SET col1=[something], col2=[something else] WHERE col1 IS NULL AND col2 IS NULL LIMIT 1;

发出查询后,调用者立即执行以下操作:

SELECT col3 FROM the_table where col1=[something], col2=[something else];

不幸的是,并发调用者声称同一行。

我宁愿不做 a SELECT FOR UPDATE,因为 [select, update, select] 将涉及到数据库的三个 RPC 而不是两个(这已经够糟糕了。)

我收集到一些 sql 方言允许UPDATE the_table WITH(UPDLOCK),但我的(galera/MySQL)不允许。我发现我必须经历这么多数据库点击才能执行这样一个基本概念,这令人震惊。我发现我的大部分搜索工作都在讨论支持 UPDLOCK 的方言的页面上结束。

它从这里走向何方?

4

2 回答 2

0

你有autocommit=1吗?

如果没有事务完整性,其他一些连接可能会在执行SELECT.

请注意,可能有多个 NULL 行,因此UPDATE可能会更改许多行。

您是否在 之后检查了“受影响的行” UPDATE?也许没有行被改变。

于 2015-08-16T20:17:15.727 回答
0

我认为最好在事务中执行所有查询或使用存储过程,该过程将负责进行所有选择和更新内容,然后将最后一个选择语句中的相应数据返回给您。有这样的交易流出,会引发您所描述的问题。您需要锁定该行,以免其他调用者检索“脏”(不是最新的)数据。

于 2015-08-16T20:41:12.680 回答