我有一个相当基本的问题:
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的方言的页面上结束。
它从哪里开始?
答案 0 :(得分:0)
你有autocommit=1
吗?
如果没有事务完整性,其他一些连接可以在你执行SELECT
之前插入并更改行。
请注意,可能有多个NULL行,因此UPDATE
可能会更改多行。
您是否检查过"行?#34;在UPDATE
之后?也许没有行被改变。
答案 1 :(得分:0)
我认为最好是在事务中执行所有查询,或者使用存储过程来处理所有选择和更新内容,然后返回给你最后一个选择的相应数据声明。如此流出交易,会引发您所描述的问题。您需要锁定该行,以便不允许其他调用者检索“脏”(不是最新)数据。