Все партнеры по транзакциям MySQL знают, что транзакция открывается через начало, транзакция фиксируется через фиксацию или транзакция откатывается через откат.
В предыдущей статье Сун Гэ также говорил с вами о некоторых принципах и связанных с ними деталях. Друзья могут просмотреть:
- Вода MVCC немного глубокая, но это действительно круто для понимания!
- Когда было создано представление согласованности?
- Четыре случая для понимания уровня изоляции транзакций MySQL
Обычно, когда мы открываем транзакцию, нам нужно зафиксировать или откатить транзакцию, чтобы завершить транзакцию, но иногда некоторые операции автоматически фиксируют транзакцию для нас.Вы можете столкнуться с некоторыми необъяснимыми проблемами.
1. DDL-операции
Первый момент заключается в том, что операция DDL будет неявно фиксировать транзакцию. Об этом Сонг Гэ действительно сказал в предыдущей статье. Давайте рассмотрим это вместе:
Все операторы DDL вызывают неявную фиксацию транзакции, другими словами, транзакция фиксируется до того, как вы выполните оператор DDL. Это означает, что транзакции с операторами DDL нельзя будет откатить в будущем.
Приведу простой пример, давайте посмотрим:
Давайте посмотрим на мою тестовую логику здесь:
- Во-первых, всего в запросе четыре записи.
- Начать транзакцию.
- Выполнить оператор удаления.
- изменить таблицу, добавить новое поле.
- откат.
- Запросите данные еще раз.
К моменту шестого шага мы обнаружили, что было запрошено только три части данных, что указывает на то, что откат на пятом шаге не вступил в силу. Причина в том, что транзакция была неявно зафиксирована до выполнения изменения.
Поэтому в повседневной разработке лучше не смешивать операторы DDL в транзакциях, а писать операторы DDL и операторы DML отдельно.
Для вышеописанного случая, если убрать альтер на четвертом шаге, то откат можно успешно откатить, друзья сами протестируют, а я не буду демонстрировать.
Конечно, операции DDL — это не только изменения, другиеТакие операции, как CREATE, DROP и т. д., также вызывают неявную фиксацию транзакций., Song Ge не будет приводить здесь примеры по одному, друзья могут попробовать сами.
2. Операция ДКЛ
Вы должны часто вступать в контакт с DDL и DML, но некоторые из DCL могут не знать об этом. DCL на самом деле является языком управления данными, который переводится на язык управления данными на китайском языке. Мы используем GRANT, REVOKE и т. д. для авторизации или восстановить права доступа к базе данных.Операция DCL.
Привожу простой пример:
Видно, что это то же самое, что и тестовые шаги в первом подразделе, за исключением того, что четвертый шаг заменен оператором GRANT, тогда окончательный откат транзакции также завершится ошибкой, поскольку транзакция была зафиксирована.
Конечно, помимо GRANT и REVOKE, другие операции, которые создают, обновляют или удаляют пользователей, также вызывают неявную фиксацию транзакций. Есть:
- CREATE USER...
- DROP USER...
- ALTER USER...
- SET PASSWORD...
3. Открыта новая транзакция
Транзакция не была зафиксирована, и в результате вы начинаете новую транзакцию, тогда предыдущая транзакция также будет неявно зафиксирована в это время. См. пример:
Это легко понять, нечего сказать.
4. Различные операции блокировки
Блокировка и разблокировка таблицы также приведет к неявной фиксации транзакции. следующее:
Заблокированный SQL, напримерlock tables table_name read|write
, вызовет неявную фиксацию транзакции, разблокируя SQL, напримерunlock tables
Также вызывает неявную фиксацию транзакции.
В дополнение к блокировкам таблиц некоторые глобальные блокировки, такие как FTWRL, также приводят к неявной фиксации транзакции, как показано ниже:
5. Работа слейва
До того, как Сонг Гэ научил всех, как освоить MySQL:
Некоторые из операций, которые мы выполняем на ведомом устройстве, похожи наstart slave
,stop slave
,reset slave
а такжеchange master to
etc также неявно фиксирует транзакцию.
6. Другие операции с таблицами
Другие операции, такие как сброс привилегий, оптимизация таблицы, восстановление таблицы и другие операции, также приведут к неявной фиксации транзакции.
Я читал в Интернете, что некоторые люди говорят, что LOAD DATA будет неявно отправлять транзакции, но Сонг Гэ лично проверил это, и кажется, что это не так.,Как показано ниже:
LOAD DATA, по-видимому, не вызывает неявную фиксацию транзакций, и вы можете обсудить различные мнения.
7. Лучшие практики
Так много неявных коммитов, как мне их запомнить? На самом деле, вам не нужно запоминать его, вам просто нужно запомнитьТолько запись, добавление, удаление, изменение и запрос в транзакциях (INSERT/DELETE/UPDATE/SELECT), вы не ошибетесь!