Все аспекты транзакций базы данных

база данных

Транзакции — важная особенность реляционных данных, но мало кто имеет полное представление о транзакциях.Эта статья расскажет вам обо всех аспектах транзакций.

бизнес-концепция

что такое транзакция

Транзакция базы данных (транзакция) представляет собой логическую единицу выполнения системы управления базой данных и состоит из ограниченной последовательности операций с базой данных.

Проблемы параллелизма

Пять проблем параллелизма:

  • Первые потерянные обновления
  • Вторая категория потерянных обновлений
  • грязное чтение
  • неповторяемое чтение
  • галлюцинации

Ниже приведены примеры по очереди.

Потерянное обновление

Транзакция, перезаписывающая обновление, зафиксированное другой транзакцией, называется потерянным обновлением.

Первая категория потерянных обновлений:

время рисовать денежные дела депозитные денежные дела
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;

Журнал транзакций

Механизм транзакции в значительной степени зависит от файла журнала транзакций.

Журнал транзакций — это отдельный файл из файла базы данных. Он хранит все изменения, внесенные в базу данных, и полностью записывает вставки, обновления, удаления, фиксации, откаты и изменения схемы базы данных. Журнал транзакций также известен как журнал повтора транзакций или журнал повторов. Журнал транзакций является важным компонентом резервного копирования и восстановления.

блокировка базы данных

Это очень важная тема в транзакциях баз данных. Из-за недостатка места мы не будем обсуждать ее здесь. Ниже я представлю статью, объясняющую ее.


Wechat-westcall

связанные ресурсы

Wechat-westcall

Серия статей о MySQL: