Защита данных
Последовательное выполнение исключает нежелательные взаимодействие
Конфликт транзакций не происходит, если они выполняются последовательно. Главное – побыстрее занять очередь. Если невыполнимая транзакция пользователя 1 заканчивается перед началом транзакции пользователя 2, то функция ROLLBACK (откат) возвращает все товары, заказанные пользователем 1, делая их доступными во время транзакции пользователя 2. Если бы во втором примере транзакции выполнялись последовательно, то у пользователя 2 не было бы возможности изменить количество единиц любого товара, пока не закончится транзакция пользователя 1. Только после окончания транзакции пользователя 1 пользователь 2 сможет увидеть, сколько есть в наличии единиц требуемого товара.
Если транзакции выполняются последовательно, одна за другой, они не смогут друг с другом взаимодействовать и нежелательные последствия таких взаимодействий исключаются, Если результат одновременных транзакций будет таким же, как и при последовательном выполнении, то эти транзакции называются упорядочиваемыми (serializable).
Внимание:
Последовательное выполнение транзакций не является панацеей. Приходится искать компромиссы между производительностью и степенью защиты. Чем больше транзакции изолированы друг от друга, тем больше времени требуется на выполнение какой-либо функции; в киберпространстве, как и в реальной жизни, на ожидание в очереди требуется время. Старайтесь найти такие компромиссы, чтобы настройки вашей системы создавали достаточную защиту, но не большую, чем та, которая вам нужна. Слишком жесткий контроль за одновременным доступом может свести производительность системы на нет.
Уменьшение уязвимости данных
Чтобы уменьшить шансы потери данных из-за несчастного случая или непредвиденного взаимодействия, можно принимать меры предосторожности на нескольких уровнях. Можно так настроить СУБД, чтобы она без вас принимала некоторые из этих мер. Вы даже иногда не будете знать о них. Кроме того, администратор базы данных может по своему усмотрению обеспечить и другие меры предосторожности. О них вы также можете быть либо осведомлены, либо нет. И наконец, как разработчик вы можете сами принять определенные меры предосторожности при написании кода. Можно избавить себя от большей части неприятностей, если выработать привычку автоматически придерживаться следующих простых принципов и всегда реализовывать их в своем коде или во время работы с базой данных.
- Использовать транзакции SQL.
- Обеспечить такой уровень изоляции, чтобы соблюдалось равновесие между производительностью и защитой.
- Знать, когда и как запускать транзакции на выполнение, блокировать объекты базы данных и выполнять резервное копирование.
Теперь поговорим об этих принципах подробно.
Использование транзакций SQL
Одним из главных инструментов SQL, предназначенных для сохранения целостности баз данных, является транзакция. Транзакция SQL состоит из любых операторов SQL, которые могут воздействовать на базу данных. Транзакция SQL завершается одним из двух операторов: COMMIT (завершение) или ROLLBACK (откат).
- Если транзакция заканчивается оператором COMMIT, то действие всех ее операторов выполняется в виде одной "пулеметной очереди".
- Если транзакция заканчивается оператором ROLLBACK, то выполняется откат, т.е. отмена действия всех ее операторов, а база данных возвращается в то состояние, в котором она находилась перед началом транзакции.
Помни:
Под приложением мы сейчас будем подразумевать программу, выполняющуюся на COBOL, С или другом языке программирования, или последовательность команд, вводимых с терминала во время одного сеанса.
Приложение может состоять из последовательности транзакций SQL. Первая из них начинается как раз в начале приложения, последняя же транзакция заканчивается в его конце. Каждый выполняемый приложением оператор COMMIT или ROLLBACK завершает одну транзакцию SQL и начинает следующую. Например, приложение с тремя транзакциями должно иметь такой общий вид: