Транзакции — важная особенность реляционных данных, но мало кто имеет полное представление о транзакциях.Эта статья расскажет вам обо всех аспектах транзакций.
бизнес-концепция
что такое транзакция
Транзакция базы данных (транзакция) представляет собой логическую единицу выполнения системы управления базой данных и состоит из ограниченной последовательности операций с базой данных.
Проблемы параллелизма
Пять проблем параллелизма:
- Первые потерянные обновления
- Вторая категория потерянных обновлений
- грязное чтение
- неповторяемое чтение
- галлюцинации
Ниже приведены примеры по очереди.
Потерянное обновление
Транзакция, перезаписывающая обновление, зафиксированное другой транзакцией, называется потерянным обновлением.
Первая категория потерянных обновлений:
время | рисовать денежные дела | депозитные денежные дела |
---|---|---|
T1 | начать транзакцию | |
T2 | начать транзакцию | |
T3 | Баланс счета запроса составляет 10 000 | |
T4 | Баланс счета запроса составляет 10 000 | |
T5 | Внесите 1000 и измените баланс на 11000 | |
T6 | совершить транзакцию | |
T7 | Снять 1000 и изменить баланс до 9000 | |
T8 | Отмените транзакцию и откатите баланс до 10 000 |
Окончательный баланс на 1000 меньше.
Вторая категория потерянных обновлений:
время | рисовать денежные дела | депозитные денежные дела |
---|---|---|
T1 | начать транзакцию | |
T2 | начать транзакцию | |
T3 | Баланс счета запроса составляет 10 000 | |
T4 | Баланс счета запроса составляет 10 000 | |
T5 | Снять 1000 и изменить баланс до 9000 | |
T6 | совершить транзакцию | |
T7 | Внесите 1000 и измените баланс на 11000 | |
T8 | совершить транзакцию |
Окончательный баланс составляет еще 1000.
Грязное чтение
Транзакция, которая считывает данные, которые еще не были зафиксированы другой транзакцией, называется грязным чтением.
Например, транзакция A изменяет строку данных, но не фиксирует транзакцию. B считывает данные, измененные транзакцией A, а затем транзакция A по какой-то причине выполняет откат, поэтому данные, считанные транзакцией B, оказываются грязными.
время | рисовать денежные дела | депозитные денежные дела |
---|---|---|
T1 | начать транзакцию | |
T2 | начать транзакцию | |
T3 | Баланс счета запроса составляет 10 000 | |
T4 | Снять 1000 и изменить баланс до 9000 | |
T5 | Баланс учетной записи запроса составляет 9000 (грязное чтение) | |
T6 | Отмените транзакцию и откатите баланс до 10 000 | |
T7 | Внесите 1000 и измените баланс на 11000 | |
T8 | совершить транзакцию |
Неповторяемое чтение
Транзакция считывает данные перед фиксацией другой транзакции и обновленными данными, которые были зафиксированы.
Одновременно выполняются транзакции A и B. Транзакция A запрашивает данные, а затем транзакция B обновляет данные. Когда A снова запрашивает данные, она обнаруживает, что данные изменились.
Неповторяющиеся чтения часто встречаются вupdate
а такжеdelete
работать.
время | рисовать денежные дела | депозитные денежные дела |
---|---|---|
T1 | начать транзакцию | |
T2 | начать транзакцию | |
T3 | Баланс счета запроса составляет 10 000 | |
T4 | Баланс счета запроса составляет 10 000 | |
T5 | Снять 1000 и изменить баланс до 9000 | |
T6 | совершить транзакцию | |
T7 | Баланс счета запроса составляет 9000 | |
T8 | Результаты двух запросов для одной и той же транзакции различны |
Фантомное чтение
Транзакция выполняет два запроса во время операции, и результат второго запроса содержит данные, которые не появились в первом запросе, или отсутствуют данные, которые появились в первом запросе.
Например, транзакции A и B выполняются одновременно, транзакция A запрашивает данные, транзакция B вставляет или удаляет данные, а транзакция A снова запрашивает, чтобы обнаружить, что в результирующем наборе нет предыдущих данных или предыдущие данные исчезли, как если бы есть иллюзия.
Фантомные чтения часто возникают вinsert
работать.
время | рисовать денежные дела | депозитные денежные дела |
---|---|---|
T1 | начать транзакцию | |
T2 | начать транзакцию | |
T3 | Количество учетных записей запроса составляет 100 000. | |
T4 | Зарегистрируйте новую учетную запись | |
T5 | совершить транзакцию | |
T6 | Количество учетных записей запросов составляет 100 001. | |
T7 | Результаты двух запросов для одной и той же транзакции различны |
характеристики сделки
Транзакции имеют 4 свойства, известные какACID
, соответственно:
- Долговечность
- Изоляция
- Последовательность
- атомарность
атомарность
Все операции в транзакции либо завершены, либо не завершены, и не будут заканчиваться определенной ссылкой посередине.
Если во время выполнения транзакции возникает ошибка, происходит ее откат (Rollback) до состояния до начала транзакции, как если бы транзакция никогда не выполнялась.
последовательность
Целостность базы данных не нарушается ни до начала транзакции, ни после ее завершения.
То есть до и после транзакции состояние базы данных удовлетворяет всем ограничениям целостности.
изоляция
Способность базы данных позволять нескольким параллельным транзакциям одновременно читать, записывать и изменять свои данные, а также изоляция могут предотвратить несогласованность данных из-за перекрестного выполнения, когда несколько транзакций выполняются одновременно.
Изоляция транзакций делится на разные уровни, включая незафиксированное чтение (Read uncommitted), чтение зафиксированное (read commit), повторяемое чтение (repeatable read) и сериализуемое (Serializable).
Упорство
После завершения транзакции изменение данных является постоянным и не будет потеряно даже в случае сбоя системы.
уровень изоляции транзакций
Четыре уровня изоляции транзакций упоминаются во введении к изоляции транзакций:
- Читать незафиксированные
- Чтение зафиксировано
- Повторяемое чтение (повторяемое чтение)
- Сериализуемый
В то же время уровень изоляции транзакции также связан с 5 проблемами параллелизма, упомянутыми выше. Чем выше уровень изоляции, тем лучше можно гарантировать целостность и согласованность данных, но тем больше влияние на параллельную производительность.
Уровень изоляции и параллелизм:
уровень изоляции | грязное чтение | неповторяемое чтение | галлюцинации |
---|---|---|---|
незафиксированное чтение | возможно | возможно | возможно |
Отправлено на чтение | невозможный | возможно | возможно |
повторяемое чтение | невозможный | невозможный | возможно |
Сериализуемый | невозможный | невозможный | невозможный |
Для большинства приложений предпочтительнее установить уровень изоляции системы базы данных на Read Committed. Это позволяет избежать потери обновлений, грязных чтений и обеспечивает более высокую производительность параллелизма. Хотя это может вызвать проблемы параллелизма, такие как неповторяющееся чтение и фантомное чтение, в отдельных случаях, когда такие проблемы могут возникнуть, приложения могут использовать пессимистическую блокировку или оптимистическую блокировку для управления.
Уровень изоляции MySQL InnoDB по умолчанию — Repeatable Read. Базы данных, такие как Oracle, по умолчанию поддерживают чтение, то есть только зафиксированные данные могут быть прочитаны.
Читать незафиксированные
Транзакции чтения не блокируют другие транзакции чтения и записи, а незафиксированные транзакции записи блокируют другие транзакции записи, но не транзакции чтения.
Этот уровень изоляции предотвращает потерю обновлений, но не грязное чтение, неповторяемое чтение или фантомное чтение.
Чтение зафиксировано
Транзакции чтения разрешают другие транзакции чтения и записи, а незафиксированные транзакции записи запрещают другие транзакции чтения и записи.
Незафиксированное чтение может предотвратить потерю обновлений и грязное чтение, но не может предотвратить неповторяющееся чтение и фантомное чтение.
Повторяемое чтение
При условии работы с одной и той же строкой данных транзакции чтения запрещают другие транзакции записи, но не блокируют транзакции чтения, а незафиксированные транзакции записи запрещают другие транзакции чтения и записи.
Этот уровень изоляции предотвращает потерю обновлений, грязное чтение, неповторяющееся чтение, но не фантомное чтение.
Сериализуемый
Обеспечивает строгую изоляцию транзакций, которая требует сериализованного выполнения транзакций, транзакции могут выполняться только одна за другой и не могут выполняться одновременно.
Этот уровень изоляции предотвращает потерю обновлений, грязное чтение, неповторяемое чтение и фантомное чтение.
Если сериализация транзакций не может быть достигнута только через «Замки уровня строки», должны использоваться другие механизмы, чтобы обеспечить доступ к тому, что вновь вставленные данные не будут доступны транзакцией, которая только что выполнила операцию запроса.
транзакционная операция
BEGIN
BEGIN
илиSTART TRANSACTION
: явно начать транзакцию.
COMMIT
COMMIT
илиCOMMIT WORK
: Фиксирует транзакцию и делает все изменения, внесенные в базу данных, постоянными.
ROLLBACK
ROLLBACK
илиROLLBACK WORK
: Все незафиксированные изменения откатываются и отменяются.
SAVEPOINT
SAVEPOINT identifier
: SAVEPOINT позволяет создать точку сохранения внутри транзакции, внутри транзакции может быть несколько SAVEPOINT.
RELEASE SAVEPOINT identifier
: удаляет точку сохранения транзакции.Если точка сохранения не указана, выполнение этого оператора вызывает исключение.
ROLLBACK
ROLLBACK
: Откат транзакции.
ROLLBACK TO identifier
: откатить транзакцию до точки сохранения.
TRANSACTION
SET TRANSACTION
: Установите уровень изоляции транзакции.
Механизм хранения InnoDB обеспечивает уровни изоляции транзакций READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE.
AUTOCOMMIT
select @@autocommit
: просмотр настроек автофиксации транзакций.
set autocommit=0
: запретить автоматическую фиксацию транзакции.
set autocommit=1
: Установить автоматическую фиксацию транзакции.
-- 查看事务自动提交设置
select @@autocommit;
-- 设置事务不自动提交
set autocommit=0;
-- 设置事务自动提交
set autocommit=1;
Журнал транзакций
Механизм транзакции в значительной степени зависит от файла журнала транзакций.
Журнал транзакций — это отдельный файл из файла базы данных. Он хранит все изменения, внесенные в базу данных, и полностью записывает вставки, обновления, удаления, фиксации, откаты и изменения схемы базы данных. Журнал транзакций также известен как журнал повтора транзакций или журнал повторов. Журнал транзакций является важным компонентом резервного копирования и восстановления.
блокировка базы данных
锁
Это очень важная тема в транзакциях баз данных. Из-за недостатка места мы не будем обсуждать ее здесь. Ниже я представлю статью, объясняющую ее.
связанные ресурсы
Серия статей о MySQL: