gpt4 book ai didi

php - MyISAM 和 InnoDB 中的单个 mysql 语句是原子的吗?

转载 作者:可可西里 更新时间:2023-11-01 06:40:02 26 4
gpt4 key购买 nike

例如,我有一行包含 C1 value = 'clean' 列,并且两个不同的客户端同时运行此查询:

update T1 set C1 = 'dirty' where Id = 1

在不使用事务的情况下,是否保证无论引擎类型如何 mysql_affected_rows() 的值对于一个客户端来说是1 并且0 是另一个吗?

最佳答案

是和否 :-)

在这两种情况下,access is serialised (假设您使用的是像 InnoDB 这样的事务引擎)因为它们在同一行,所以它们不会相互干扰。换句话说,语句原子的。

但是,受影响的行数实际上取决于您在打开连接时设置的配置。 page for mysql_affected_rows()有这个要说的(我的粗体):

For UPDATE statements, the affected-rows value by default is the number of rows actually changed. If you specify the CLIENT_FOUND_ROWS flag to mysql_real_connect() when connecting to mysqld, the affected-rows value is the number of rows "found"; that is, matched by the WHERE clause.

来自the mysql_real_connect page :

CLIENT_FOUND_ROWS: Return the number of found (matched) rows, not the number of changed rows.

因此,就 CLIENT_FOUND_ROWS 的配置情况而言,受影响的行为:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1

与数据是否更改没有任何关系,只有匹配的行。这对于两个查询都是 1。 p>

另一方面,如果 CLIENT_FOUND_ROWS 未设置,则第二个查询实际上不会更改该行(因为它已经填充了“脏”)并且会行数为零。

如果您想要相同行为而不考虑该设置(仅显示更改),您可以使用类似的东西:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'

关于php - MyISAM 和 InnoDB 中的单个 mysql 语句是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com