Изучаем sql



Pdf көрінісі
бет203/261
Дата28.07.2022
өлшемі1,6 Mb.
#147825
1   ...   199   200   201   202   203   204   205   206   ...   261
Байланысты:
Изучаем SQL ( PDFDrive )


Глава 12. Транзакции
к недопустимым временам ожидания. С другой стороны, в случае бло
кировки строки сохраняется намного больше промежуточных резуль
татов, но такая блокировка позволяет многим пользователям вносить
изменения в одну таблицу, если это касается разных строк. Из трех
серверов, обсуждаемых в этой книге, Microsoft SQL Server использует
блокировки страницы и строки, Oracle Database – блокировку строки,
а MySQL может блокировать таблицу, страницу или строку (опять же
в зависимости от выбранного механизма хранения).
Возвращаясь к отчету: данные, появляющиеся на его страницах, будут
отражать состояние БД или на момент начала создания отчета (если
сервер использует контроль версий), или на момент осуществления сер
вером блокировки чтения (если сервер использует блокировки и чте
ния, и записи).
Что такое транзакция?
Если бы серверы БД работали безостановочно, если бы пользователи все
гда позволяли программам завершать выполнение и если бы приложе
ния всегда завершались без неустранимых ошибок, прерывающих вы
полнение, то незачем было бы обсуждать параллельный доступ к базам
данных. Однако ни на одну из перечисленных ситуаций рассчитывать
нельзя. Следовательно, чтобы несколько пользователей могли осущест
влять доступ к одним и тем же данным, необходим еще один элемент.
Этой дополнительной деталью пазла параллелизма является 
транзак
ция 
(
transaction
) – механизм группировки нескольких SQLвыраже
ний, позволяющий успешно выполниться 
всем
или 
ни одному 
из них.
Если клиент пытается перевести 500 долларов со сберегательного счета
на текущий, он немного расстроится, если деньги будут успешно сняты
с первого счета, но не внесены на второй. Какой бы ни была причина
сбоя (сервер был выключен для проведения работ по техническому об
служиванию, истекло время ожидания запроса на блокировку страни
цы таблицы 
account
и др.), клиент захочет вернуть свои 500 долларов.
Чтобы защититься от ошибок такого рода, программа, обрабатываю
щая запрос на перевод, сначала начинает транзакцию, затем выполня
ет SQLвыражения, необходимые для перемещения денег со сберега
тельного счета на текущий, и, если все проходит успешно, завершает
транзакцию, формируя команду 
commit
(фиксировать). Однако если
происходит чтото непредвиденное, программа выдает команду 
rollback
(откат), которая указывает серверу отменить все изменения, внесенные
с момента начала транзакции. Весь процесс может выглядеть так:
START TRANSACTION;
/* Снять деньги с первого счета, обеспечив достаточный остаток */
UPDATE account SET avail_balance = avail_balance 500
WHERE account_id = 9988
AND avail_balance > 500;


Что такое транзакция?
233
IF <Предыдущим выражением была изменена ровно одна строка> THEN
/* Внести деньги на следующий счет */
UPDATE account SET avail_balance = avail_balance + 500
WHERE account_id = 9989;
IF <Предыдущим выражением была изменена ровно одна строка> THEN
/* Все получилось, сделать изменения постоянными */
COMMIT;
ELSE
/* Чтото не так, отменить все изменения, сделанные в данной транзакции */
ROLLBACK;
END IF;
ELSE
/* Недостаток средств на счете или при обновлении возникла ошибка */
ROLLBACK;
END IF;
Хотя предыдущий фрагмент кода может показаться похожим
на один из процедурных языков программирования, предостав
ляемых основными компаниямипроизводителями БД, такими
как PL/SQL от Oracle или Transact SQL от Microsoft, он написан
на псевдокоде и не пытается имитировать ни один конкретный
язык.
Приведенный выше фрагмент кода начинается с запуска транзакции.
После этого делается попытка удалить 500 долларов с текущего счета
и затем добавить 500 долларов на сберегательный счет. Если все про
ходит хорошо, транзакция фиксируется; однако если чтото не так,
происходит откат транзакции, т. е. все внесенные с начала транзакции
изменения отменяются.
С помощью транзакции программа гарантирует, что пятьсот долларов
или останутся на сберегательном счету, или перейдут на текущий счет
без какойлибо возможности краха. Независимо от того, была ли тран
закция зафиксирована или произошел откат, все ресурсы, занятые
(например, блокировка записи) во время выполнения транзакции, по
завершении транзакции высвобождаются.
Конечно, если программе удается завершить оба выражения 
update
, но
сервер выключается до того, как смогут выполниться 
commit
или 
roll
back
, откат транзакции произойдет, когда сервер вернется в рабочий
режим. (Одна из задач, которую должен выполнить сервер перед воз
вращением в нормальный режим работы, – найти все незавершенные
транзакции, запущенные на момент выключения сервера, и выпол
нить их откат.)


Достарыңызбен бөлісу:
1   ...   199   200   201   202   203   204   205   206   ...   261




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет