“可曾有过在其值的一些地方设法得到插入的情况下/由于某种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