Ниже показан пример псевдокода, выполняющий перевод средств между счетами. Это упрощенная версия, позволяющая установить счет в отрицательное значение.
CREATE Procedure TransferAmount
(
@Amount Money
@ID_A int
@ID_B int
)
AS
BEGIN TRANSACTION
UPDATE Accounts SET Balance = Balance + @Amount WHERE AccountID = @ID_A
UPDATE Accounts SET Balance = Balance - @Amount WHERE AceountID = @ID_B
IF (@@ERROR > 0)
ROLLBACK
ELSE
COMMIT
На заметку! В SQL Server хранимые процедуры также могут выполнять распределенные транзак ции (включающие множество источников данных, обычно расположенных на многих серверах). По умолчанию каждая транзакция начинается как локальная, но если вы обращаетесь к базе данных на другом сервере, транзакция автоматически становится распределенной и управляется службой Windows DTC (Distributed Transaction Coordinator — Координатор распределенных транзакций).
Большинство провайдеров данных ADO.NET включают поддержку баз данных. Транзакции стартуют через объект Connection вызовом метода BeginTransaction(). Этот метод возвращает специфичный для провайдера объект Transaction, используемый для управления транзакцией. Все классы Transaction реализуют интерфейс IDbTransaction. Примеры включают SqlTransactlon, OleDbTpanaaction, OracleTransaction и так далее.
Класс Transaction представляет два ключевых метода:
Обычно вы используете Commit() в конце операции. Однако если в процессе будет возбуждено любое исключение, вы должны вызвать Rollback().
Рассмотрим пример, вставляющий две записи в таблицу Employees:
string connectionString =
WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd1 = new SqlCommand(
"INSERT INTO Employees (LastName, FirstName) VALUES ('Joe','Tester')");
SqlCommand cmd2 = new SqlCommand(
"INSERT INTO Employees (LastName, FirstName) VALUES ('Harry','Sullivan')");
предыдущая следующая страница оглавление
327