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

Php MyISAM和InnoDB中的单个mysql语句是原子的吗?,php,mysql,database,transactions,atomic,Php,Mysql,Database,Transactions,Atomic,例如,我有一行的列C1值='clean',两个不同的客户端同时运行这个查询: update T1 set C1 = 'dirty' where Id = 1 在不使用事务的情况下,是否保证无论引擎类型如何,mysql\u impacted\u rows()的值对于一个客户端为1,对于另一个客户端为0?是和否:-) 在这两种情况下,(假设您使用的是像InnoDB这样的事务引擎),因为它们位于同一行,所以它们不会相互干扰。换句话说,这些语句是原子的 但是,受影响的行数实际上取决于打开连接时的配置集

例如,我有一行的列
C1值='clean'
,两个不同的客户端同时运行这个查询:

update T1 set C1 = 'dirty' where Id = 1
在不使用事务的情况下,是否保证无论引擎类型如何,
mysql\u impacted\u rows()
的值对于一个客户端为
1
,对于另一个客户端为
0

是和否:-)

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

但是,受影响的行数实际上取决于打开连接时的配置集。这句话的意思是(我的粗体):

对于UPDATE语句,默认情况下受影响的行数值是实际更改的行数。如果在连接到mysqld时将CLIENT_FOUND_ROWS标志指定为mysql_real_connect(),则受影响的行数值为行数“FOUND”;也就是说,由WHERE子句匹配

和来自:

客户端找到的行数:返回找到的(匹配的)行数,而不是更改的行数

因此,就配置的
客户端\u FOUND\u行
而言,受影响的行:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1
与数据是否更改无关,只与匹配的行有关。这两个查询都是1

另一方面,如果未设置
CLIENT\u FOUND\u ROWS
,则第二个查询实际上不会更改行(因为它已经填充了“dirty”),并且行计数为零

如果您希望在不考虑该设置的情况下实现相同的行为(仅显示更改),则可以使用以下方法:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'
更新T1集合C1='dirty',其中id=1和C1'dirty'

如果您使用像InnoDB这样的事务性存储引擎,MySQL是符合ACID的。

您的意思是说单语句更新对MyIASM来说不是原子的吗?快速的google建议,只要您从不杀死线程或查询,MyISAM基本上是原子的@sanmai:From:锁定读取、更新或删除通常会在SQL语句处理过程中扫描的每个索引记录上设置记录锁定。@MyISAM是一个废物,应该与所有NoSQL数据库一起降级到它所属的位置:-)@sanmai,抱歉,有点误读了查询,如果你需要原子性,但不想使用InnoDB表,