Что такое SQL Transactions, Transaction Isolation Levels?

Рейтинг: 6Ответов: 2Опубликовано: 03.04.2015

Что такое SQL Transactions, Transaction Isolation Levels?

Ответы

▲ 3

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

Простой (и классический) пример: допустим, у вас есть банковский счет, на котором лежит аж целых сто рублей. Вы захотели финансово помочь организации по спасению камчатских поползней, и перевели пятьдесят рублей на ее счет. Так вот перевод денег с вашего счета на счет этой организации и будет транзакцией, которая состоит из двух операций: уменьшение баланса вашего счета на пятьдесят рублей и увеличение баланса их счета на те же пятьдесят рублей. Для обеспечения целостности данных нужно чтобы обе операции были выполнены успешно, либо не были выполнены вообще, ведь если деньги с вашего счета будут списаны, но не поступят на счет организации, то такой перевод нельзя будет считать успешным, точно также он не будет корректным, если средства у вас не спишутся, а у организации - начислятся (ни вы, ни они вероятно не будут против такого развития событий, но ваш банк скорее всего этот аукцион невиданной щедрости не поддержит, рискуя на этом обанкротиться)

Соответственно, транзакция в sql - это последовательность операторов, которая либо выполняется целиком, либо целиком же откатывается. (почитайте про ключевые слова TRANSACTION, COMMIT, ROLLBACK)

Пару слов об уровнях изоляции. При одновременном выполнении нескольких транзакций возникает проблема доступа к данным, которые меняются внутри транзакций. Допустим, транзакция перевода ваших денег списала у вас со счета те же самые 50 рублей. При этом с данными вашего счета в тот же момент времени работает какая-то другая транзакция (допустим, кто-то прислал вам 100 рублей). Логично было бы предположить, что после этих двух операций у вас на счете будет 150 рублей (-50 в пользу поползней, остаток 50 руб, затем +100 от таинственного благотворителя, итого 150). Но проблема в том, что транзакции выполнялись одновременно, и обе считают, что изначально на вашем счету было 100 рублей (и они, черт возьми, по-своему правы). Тем самым, окончательная сумма на вашем счету зависит от того, какая из них выполнится раньше. Если первая, то у вас будет 200 рублей, если вторая - то всего лишь 50. Это лишь один пример возможных проблем (эта ситуация называется "потерянное обновление"), но есть и ряд других способов поломать данные.

Во избежание подобных казусов придуманы уровни изоляции транзакций, которые определяют, как именно несогласованные данные могут быть использованы другими транзакциями. Стандарт SQL-92 предполагает 4 таких уровня в порядке возрастания силы: Read uncommitted, Read committed, Repeatable read, Serializable. Чем более сильным является уровень изоляции, тем надежнее он обеспечивает согласованность данных (и тем сильнее он влияет на производительность)

Подробнее - в соответствующей литературе

▲ 2

Transaction - это просто группа объединенных логически операций, все результаты выполнения которых или все вместе фиксируются, или откатываются.

Transaction Isolation Levels - это про решение проблем чтения данных при конкуррентных транзакциях. Т.е. когда в рамках одной транзакции мы читаем те же данные, которые другая транзакция в это же время изменяет. Есть 4 уровня изоляции, каждый из которых решает 1 связанную с этим проблему + проблемы всех предыдущих уровней:

# Уровень изоляции Решаемая проблема Описание проблемы
1 Read Uncommited Lost Update Прочитанные данные сформированы только последней из параллельных транзакций. Влияние остальных транзакций в данных не учтено
2 Read Commited Dirty Read Прочитанные данные были изменены транзакцией, которая затем была откачена
3 Repeatable Read Non-repeatable Read При повторном чтении тех же данных данные отличаются т.к. были изменены другой транзакцией в промежутке между чтениями
4 Serialization Phantom Read Повторная выборка данных по тем же параметрам отличается от первой, т.к. данные в промежутке между чтениями были изменены другой транзакцией
  • Уровни изоляции относятся к слою БД.
  • Уровни изоляции - это компромисс между точностью данных и производительностью: более высокий уровень -> выше точность, но ниже скорость.
  • В БД по умолчанию обычно выставлен Read Commited (PostgreSQL) или Repeatable Read (MySQL).