[英]MySQL MyISAM/InnoDB updates are not atomic across two connections (force write?)
[英]Are single mysql statements atomic in MyISAM and InnoDB?
例如,我有一列一列C1 value = 'clean'
,和兩個不同的客戶端運行在同一時間這個查詢:
update T1 set C1 = 'dirty' where Id = 1
在不使用事務的情況下, 無論引擎類型如何 ,都保證 mysql_affected_rows()
的值對於一個客戶端為1
對於另一個客戶端為0
?
是和否:-)
在這兩種情況下, 訪問都是序列化的 (假設您正在使用像InnoDB這樣的事務引擎),因為它們在同一行中,因此它們不會相互干擾。 換句話說,這些陳述是原子的。
但是,受影響的行數實際上取決於打開連接時的配置集。 mysql_affected_rows()的頁面有這個說(我的粗體):
對於UPDATE語句,默認情況下受影響的行值是實際更改的行數。 如果在連接到mysqld時指定了mysql_real_connect()的CLIENT_FOUND_ROWS標志,則受影響的行值是“找到”的行數; 也就是說,由WHERE子句匹配。
CLIENT_FOUND_ROWS:返回找到的 (匹配的)行數,而不是已更改的行數。
那么,在什么情況與條件CLIENT_FOUND_ROWS
配置,則受影響的行為:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1
與數據是否更改 無關 ,只與哪些行匹配。 對於兩個查詢,這將是1。
另一方面,如果未設置CLIENT_FOUND_ROWS
,則第二個查詢實際上不會更改該行(因為它已經填充了'dirty')並且行計數為零。
如果您想要相同的行為而不管該設置(僅顯示更改),您可以使用以下內容:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'
如果您使用像InnoDB這樣的事務存儲引擎,MySQL將符合ACID標准。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.