Четверг, 09.05.2024, 07:56
Приветствую Вас Гость

LabSoft

Меню сайта
Категории каталога
Статьи по кодингу [24]
Материалы по кодингу
КреатиFF [144]
Рассказы, истории, анекдоты...
Разное [8]
Советы, трюки, полезные рекомендации, статьи о новом и забытом старом...
Наш опрос
Как Вы узнали о нас?
Всего ответов: 27
Главная » Статьи » Статьи по кодингу

Транзакции в MS SQL Server
Транзакции в MS SQL Server

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

SET TRANSACTION - начинает транзакцию и определяет ее поведение.
COMMIT - сохраняет изменения, внесенные транзакцией, в базе данных и завершает транзакцию.
ROLLBACK - отменяет изменения, внесенные транзакцией, и завершает транзакцию.
В общем виде, синтаксис команды SQL для запуска транзакции:

SET TRANSACTION [Access mode] [Lock Resolution] [Isolation Level] [Table Reservation]

Access Mode - определяет тип доступа к данным. Может принимать два значения: READ ONLY - указывает, что транзакция может только читать данные и не может модифицировать их; READ WRITE (по умолчанию) - указывает, что транзакция может читать и модифицировать данные.

Lock Resolution - определяет ход событий при обнаружении конфликта блокировки. Может принимать два значения: WAIT - значение по умолчанию. Ожидает разблокировки требуемой записи, после этого пытается продолжить работу; NO WAIT - немедленно возвращает ошибку блокировки записи.

Isolation Level - определяет порядок взаимодействия данной транзакции с другими в данной базе. Может принимать значения: SNAPSHOT - значение по умолчанию. Внутри транзакции будут доступны данные в том состоянии, в котором они находились на момент начала транзакции. Если по ходу дела в базе данных появились изменения, внесенные другими завершенными транзакциями, то данная транзакция их не увидит. При попытке модифицировать такие записи возникнет сообщение о конфликте; SNAPSHOT TABLE STABILITY - предоставляет транзакции исключительный доступ к таблицам, которые она использует. Другие транзакции смогут только читать данные из них; READ COMMITTED - позволяет транзакции видеть текущее состояние базы.

Table Reservation - позволяет транзакции получить гарантированный доступ необходимого уровня к указанным таблицам. Существует четыре уровня доступа: PROTECTED READ - запрещает обновление таблицы другими транзакциями, но позволяет им выбирать данные из таблицы; PROTECTED WRITE - запрещает обновление таблицы другими транзакциями, читать данные из таблицы могут только транзакции типа SNAPSHOT или READ COMMITTED;
SHARED READ - самый либеральный уровень. Читать могут все, модифицировать - транзакции READ WRITE;
SHARED WRITE - транзакции SNAPSHOT или READ COMMITTED READ WRITE могут модифицировать таблицу, остальные - только выбирать данные.

Пример транзакции в MS SQL Server: одновременно в обе таблицы нужно добавить новую запись с табельным номером 5. Для этого в MS SQL Server создаем запрос и запускаем его:

BEGIN TRANSACTION
INSERT СОТРУДНИКИ (TAB) VALUES (5)
INSERT ОТРАБОТАНО (TAB) VALUES (5)
IF @@ERROR = 0
COMMIT
ELSE
ROLLBACK //откат

В данном случае либо добавятся обе записи там, где нужно, либо ничего не произойдет.
Данную транзакцию можно записать в процедуру, которую также можно вызывать для исполнения:

CREATE PROCEDURE TRANZ
AS BEGIN
BEGIN TRANSACTION
INSERT СОТРУДНИКИ (TAB) VALUES (11)
INSERT ЧАСЫ (TAB) VALUES (11)
IF @@ERROR = 0
COMMIT
ELSE
ROLLBACK
END

Также можно создать хранимую процедуру с этим содержимым, причем MS SQL Server по максимуму постарается её довести до необходимого состояния, указав стандартные параметры.

Транзакции в Delphi бывают явные и неявные.
Явная транзакция - это транзакция, начатая и завершенная с помощью методов объекта DataBase: StartTransaction, Commit, RollBack. После начала явной транзакции, все изменения, вносимые в данные относятся к этой транзакции. В рамках одного соединения нельзя начать две транзакции.
Неявная транзакция стартует при модификации данных, если в данный момент нет явной транзакции. Неявная транзакция возникает, например, при выполнении метода Post для объектов Table и Query. То есть, если была отредактирована запись, в DBGrid и осуществлен переход на другую запись, то это влечет за собой выполнение Post, что, в свою очередь, приводит к началу неявной транзакции, обновлению данных внутри транзакции и ее завершению. Важно отметить, что неявная транзакция, начатая с помощью методов Post, Delete, Insert, Append и т.д. заканчивается автоматически.

Категория: Статьи по кодингу | Добавил: Jimmy (10.03.2008)
Просмотров: 2460 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0