例如,我有一列C1 value = 'clean'
一排,和兩個不同的客戶端運行在同時此查詢:MyISAM和InnoDB中的單個mysql語句是否是原子的?
update T1 set C1 = 'dirty' where Id = 1
不使用交易,是它無論保證發動機類型了的mysql_affected_rows()
的價值將爲1
爲一個客戶端和0
爲另一個?
例如,我有一列C1 value = 'clean'
一排,和兩個不同的客戶端運行在同時此查詢:MyISAM和InnoDB中的單個mysql語句是否是原子的?
update T1 set C1 = 'dirty' where Id = 1
不使用交易,是它無論保證發動機類型了的mysql_affected_rows()
的價值將爲1
爲一個客戶端和0
爲另一個?
Yes和No :-)
在這兩種情況下,access is serialised(假設你使用的事務引擎InnoDB的一樣),因爲他們打的同一行,所以它們不會互相干擾。換言之,報表是原子。
但是,當您打開連接時,受影響的行數實際上取決於您的配置集。該page for mysql_affected_rows()有這樣一段話(我的粗體):
對於UPDATE語句,默認情況下,受影響的行值實際上是改變的行數。如果在連接到mysqld時將mysql_real_connect()指定爲CLIENT_FOUND_ROWS標誌,則受影響的行值爲行數「found」;即通過WHERE子句進行匹配。
而且從the mysql_real_connect page:
CLIENT_FOUND_ROWS:返回的數求出(匹配的)行,而不是數量來改變行。
所以,在如何處理CLIENT_FOUND_ROWS
發生方面進行配置,受影響的行爲:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1
有什麼做的數據是否改變,只有哪些行相符。這兩個查詢都是1。
在另一方面,如果CLIENT_FOUND_ROWS
是不組,第二個查詢實際上不會改變行(因爲它已經與「髒」填充),並且將具有零行計數。
如果你想要的相同的行爲,無論該設置(只顯示改變),你可以使用類似:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'
MySQL是符合ACID,如果你使用像InnoDB的事務性存儲引擎。
如果您需要原子性,但不想使用InnoDB表[請參閱MySQL鎖定表](http://dev.mysql.com/doc/refman/5.1/en/lock-tables。html) – bobobobo