簡體   English   中英

MyISAM和InnoDB中的單個mysql語句是否是原子的?

[英]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子句匹配。

並從mysql_real_connect頁面

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM