
Параметры транзакций
SQL – транзакции имеет два параметра – режим и уровень изоляции. Для установки значений параметров применяется SQL – оператор SET TRANSACTION:
SET TRANSACTION
Режим,
ISOLATION LEVEL уровень_изоляции;
Параметр «режим» может принимать два значения:
READ WRITE (чтение – запись) – это значение устанавливается по умолчанию;
READ ONLY (только чтение).
Уровень изоляции транзакции устанавливает, как определенная транзакция может влиять на другие транзакции. Во время исполнения транзакций могут происходить следующие нарушения целостности данных:
«грязное чтение» (dirty read) – чтение транзакцией записи, которая изменена другой транзакцией, но это изменение ещё не записано на диск;
невоспроизводимое чтение (nonrepeatable reads) – при повторном чтении уже ранее считываемых данных транзакция обнаруживает изменения или удаления данных, сделанные другой завершенной транзакцией;
фантомное чтение (phantom reads) - при повторном чтении данных одна и та же транзакция обнаруживает после предыдущего чтения новые строки данных, вставленные другой транзакцией;
В стандартах SQL установлены четыре уровня изоляции транзакции :
SERIALIZABLE ( последовательное выполнение или сериализуемость);
REPEATABLE READ ( повторяющееся чтение);
READ COMMITED (подтвержденное чтение) - значение уровня изоляции по умолчанию;
READ INCOMMITED (неподтвержденное чтение).
Рассмотрим более подробно смысл уровней изоляции.
Самый низкий уровень изоляции транзакций – это уровень READ INCOMMITED (неподтвержденное чтение). В этом случае на выполнение определенной транзакции могут влиять как окончательные, так и промежуточные результаты других транзакций: «грязное чтение», невоспроизводимое чтение и фантомное чтение. Поэтому этот уровень используется относительно редко. Но он является самым быстрым.
В режиме READ COMMITED (подтвержденное чтение или завершенное чтение данных) транзакциям разрешается читать только подтвержденные данные. Этот уровень изоляции устраняет «грязное» чтение, но оставляет возможными невоспроизводимое чтение и фантомное.
Режим изоляции REPEATABLE READ (повторяющееся или воспроизводимое чтение). В этом режиме строки (записи) таблицы, к которым обращается определенная транзакция для записи или чтения, блокируются и до окончания её другая транзакция не может обратиться к тем же данным (записям). Но при этом уровне может проявляться фиктивное («фантомное») чтение. (“Фантом — образ чего-либо из прошлого (человек, существо, предмет) [Википедия] ”). Если в ходе одной транзакции исполняются два запроса на выборку, а между ними другая транзакция добавит в таблицу новую строку, эта строка станет «фантомом», т.к. она неожиданно появляется в ходе одной и той же транзакции. Это и есть суть проблемы фантомного чтения.
Наибольший уровень изоляции транзакций достигается при значении SERIALIZABLE (последовательное выполнение или сериализуемость). В этом случае различные транзакции будут полностью изолированы друг от друга и не могут влиять друг на друга. Пока не будет завершена начавшаяся транзакция, другая должна ожидать её завершения. Но это приводит к заметному снижению производительности системы. На любом уровне ниже SERIALIZABLE появляется риск нарушения целостности базы данных. Но на этот риск идут во имя повышения производительности. Для этого и используют соответствующие уровни изоляции.
По умолчанию в большинстве СУБД используется режим READ WRITE и уровень изоляции READ COMMITED. Если необходимо установить другие параметры транзакции, отличающиеся от значений по умолчанию, то в нужный момент следует применить команду SET TRANSACTION, например,
SET TRANSACTION
READ ONLY,
ISOLATION LEVEL SERIALIZABLE ;
С этого момента следующая транзакция будет иметь уже параметры режим READ ONLY и уровень изоляции SERIALIZABLE.