为什么"更新foo ...其中bar为null"让多个来电者声称同一行?

时间:2015-08-14 01:18:52

标签: mysql sql locking updates galera

我有一个相当基本的问题:

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];

不幸的是,并发呼叫者声称同一行。

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

我认为sql的某些方言允许UPDATE the_table WITH(UPDLOCK),但是我的(galera / MySQL)没有。{我发现令人震惊的是,我必须经历这么多数据库命中才能执行这样一个基本概念。我发现我的大多数搜索努力都在讨论支持UPDLOCK的方言的页面上结束。

它从哪里开始?

2 个答案:

答案 0 :(得分:0)

你有autocommit=1吗?

如果没有事务完整性,其他一些连接可以在执行SELECT之前插入并更改行。

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

您是否检查过"行?#34;在UPDATE之后?也许没有行被改变。

答案 1 :(得分:0)

我认为最好是在事务中执行所有查询,或者使用存储过程来处理所有选择和更新内容,然后返回给你最后一个选择的相应数据声明。如此流出交易,会引发您所描述的问题。您需要锁定该行,以便不允许其他调用者检索“脏”(不是最新)数据。