「可曾有過在其值的一些地方設法得到插入的情況下/由於某種DB錯誤的更新數據庫,但其餘沒有得到插入/更新可能/失敗/內存 - 跑出去了嗎?「
晚的答案,但也許是有趣:[ON DUPLICATE KEY] UPDATE
不嚴格原子的單排(既不MyISAM
,也不InnoDB
),但它會在問候的錯誤是原子的。
有什麼區別?好吧,這說明在承擔嚴格的原子潛在的問題:
CREATE TABLE `updateTest` (
`bar` INT(11) NOT NULL,
`foo` INT(11) NOT NULL,
`baz` INT(11) NOT NULL,
`boom` INT(11) NOT NULL,
PRIMARY KEY (`bar`)
)
COMMENT='Testing'
ENGINE=MyISAM;
INSERT INTO `updateTest` (`bar`, `foo`, `baz`, `boom`) VALUES (47, 1, 450, 2);
INSERT
`updateTest`
(`bar`, `foo`, `baz`, `boom`)
VALUES
(47, 0, 400, 5)
ON DUPLICATE KEY UPDATE
`foo` = IF(`foo` = 1, VALUES(`foo`), `foo`),
`baz` = IF(`foo` = 1, VALUES(`baz`), `baz`),
`boom` = IF(`foo` = 1, VALUES(`boom`), `boom`);
(47, 1, 450, 2)
會已經變成了(47, 0, 450, 2)
,而不是爲(47, 0, 400, 5)
。如果你假設嚴格原子性(這不是說你應該;你可能更喜歡這種行爲),那應該不會發生 - foo
應該不會發生改變之前其他列的值甚至評估。 foo
應與其他列一起更改 - 全部或全部不變。
如果我說原子的問候錯誤,我的意思是,如果你刪除多數民衆贊成突出嚴格的情況下,這樣上面的例子中IF()
條件...
INSERT INTO `updateTest` (`bar`, `foo`, `baz`, `boom`) VALUES (48, 1, 450, 2);
INSERT
`updateTest`
(`bar`, `foo`, `baz`, `boom`)
VALUES
(48, 0, 400, 5)
ON DUPLICATE KEY UPDATE
`foo` = VALUES(`foo`),
`baz` = VALUES(`baz`),
`boom` = VALUES(`boom`);
...你永遠要麼與(48, 1, 450, 2)
或(48, 0, 400, 5)
您的發言結束後/墜毀,並不一些中間狀態一樣(48, 0, 450, 2)
結束。
對於UPDATE
的行爲也是如此,但因爲您可以將條件語句放入您的WHERE
子句中,所以更有理由在此處處理IF()
語句。
結論:在邊緣情況之外,即使使用MyISAM
,您也確實對單行語句具有原子性。見Johannes H.'s answer for further information。
在任何符合ACID的數據庫中,對「插入」的單個調用應該是原子的。 –
爲什麼你不測試它 - 你不需要數百個數據點來測試它! – gvee
可能重複[是連接插入/更新MySQL的原子操作?](http://stackoverflow.com/questions/19444623/is-join-insert-update-on-mysql-an-atomic-operation) – Daniel