MySQL 5.0/5.1. Допустим, у нас есть табличка:
CREATE TABLE A (v INT UNSIGNED NOT NULL, PRIMARY KEY(v)) ENGINE = InnoDB;
И мы в неё что-то пишем, что в конечном итоге нарушает PK. Причем делаем это в контексте транзакции:
START TRANSACTION;
INSERT INTO A SET v = 1;
INSERT INTO A SET v = 2;
INSERT INTO A SET v = 3;
INSERT INTO A SET v = 1; -- PK violation!
COMMIT;
По моему скромному разумению, если в процессе исполнения транзакции произошла какая то ошибка, то все модифицирующие выражения должны откатываться. Применимо к нашему случаю это означает, что после того, как произошла попытка добавить дублирующее значение в PK, все три предыдущих INSERT-а должны откатиться назад и по выходу табличка должна быть пуста. Так? Иначе, в чем же тогда смысл автоматического отката транзакции?
Собственно проблема в том, что по крайней мере в указанном выше примере ничего не откатывается. Т.е. после возникновения ошибки вместо пустой таблички имеем v = {1, 2, 3}.
Вопрос: Что я делаю не так :-? Спасибо.