mysql - 为什么 "update foo ... where bar is null"让多个调用者声明同一行?

标签 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,因为[选择、更新、选择]将涉及到数据库的三个rpc,而不是两个(这已经够糟糕了。)

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

它从这里到哪里去?

最佳答案

您有autocommit=1吗?

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

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

您在UPDATE之后检查过“受影响的行”吗?也许没有更改任何行。

关于mysql - 为什么 "update foo ... where bar is null"让多个调用者声明同一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32000906/

相关文章:

sql - 两列通过 SQL Server 2012 上的触发器在同一个表上相互更新

sql - 是否可以将元组数组中的值添加到表中的单独列中

java - 锁定时可以对锁进行垃圾回收吗?

Java - MySQL - 连接到 mysql 数据库时出错

mysql - SQL查询-动态子查询

PHP 比较变量每次都返回 false

php - 使用 javascript 获取 php/mysql 值

java - 如何避免java.sql.SQLException :[Microsoft][ODBC Microsoft Access Driver] could not find file '(unkown)'

c - 当只有一个线程写入共享变量时,我需要锁吗?

c# - .net 中的锁定行为如何?