MySQL Auto Increment Columns на транзакции, COMMIT и ROLLBACK

При использовании MySQL START TRANSACTION и решение MySQL откат - В случае, если стол столбец AUTO_INCREMENT - столбец... уменьшен во время откат?

Или это?

У меня возникают некоторые проблемы, когда данные транзакции должным образом откатываются - но похоже, что таблица была автоматически увеличена и не уменьшена в откате.


# BOTH TABLES START OUT EMPTY // TABLE1 ID is **auto_increment** 

START TRANSACTION;

INSERT INTO `TABLE1` (`ID` ,`NAME`) VALUES (NULL , 'Ted');  # MySQL TABLE1 **ID** is Auto incremented to 1 

INSERT INTO `TABLE2` (`ID` ,`WRONGVALUE`) VALUES (NULL , 'some value');  # error. This TRANSACTION will not succeed 

COMMIT;  # Because of the error - this TRANSACTION is now rolled back and Ted is NOT added


Поскольку MySQL будет автоматически указывать идентификатор в первой таблице - независимо от того, успешна или неудачна транзакция - стандартная практика для этого, чтобы уменьшить таблицу самостоятельно?

Ответ 1

Нет, механизмы автоинкремента должны работать вне сферы транзакций, потому что другой пользователь может вставить в ту же таблицу, прежде чем завершить транзакцию. Другая пользовательская транзакция должна иметь возможность выделить следующее значение, прежде чем узнать, использует ли ваша транзакция только что выделенное значение.

Повторите свой комментарий: если я могу сказать это более четко, любое изменение в объеме транзакции может быть отменено. Счетчик автоинкремента не откатывается, поэтому он не подчиняется транзакциям атомарности. Он также не подчиняется изоляции, потому что другая транзакция получает следующее значение, даже если транзакция еще не выполнена.

Способ автоинкремента означает, что иногда, если вы вставляете некоторые строки и затем откатываете транзакцию, значения, которые вы выделили с помощью автоматического увеличения, теряются навсегда!

Но все в порядке. Значения первичного ключа должны быть уникальными, но они не обязательно должны быть последовательными. Другими словами, они не являются номерами строк, и вы не должны использовать их так. Поэтому вам не нужно будет уменьшать значения, созданные с помощью автоматического увеличения.