Реклама:

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

Выполнение транзакции и ее завершение (откат или подтверждение) должны санкционироваться самим приложением и ни в коем случае не пользователем.

И наконец, транзакции не стоит употреблять для выполнения SQL-операторов, обновляющих один источник данных: SQL Server и так автоматически выполняет каждый такой оператор в контексте отдельной транзакции. Так что если происходит обновление 1000 записей оператором UPDATE и на обновлении 801-й записи произойдет сбой, сервер сам, без нашего вмешательства, обязан отменить изменение предыдущих 800 записей.

6.3.4. Общая схема использования транзакций в приложении

Если провайдер данных (такой, как SQL Server) поддерживает транзакции, то транзакция начинается методом BeginTransaction объекта соединения (OleDb Connection или sqlConnection). Разновидности этого метода для обоих классов соединения приводятся ниже в 6.3.4.1.

Метод BeginTransaction возвращает объект транзакции (класса SqlTran-saction или OleDbTransaction).

Операции изменения данных должны включаться в контекст транзакции. Для этого команда данных в свойство Transaction должна установить ссылку на ранее созданный объект транзакции.

Шаги изменения данных заключаются в блок try ... catch, и, если произошла ошибка, происходит отмена всех изменений (откат транзакции) методом Rollback объекта транзакции. Если ни одной ошибки не произошло, изменения запоминаются в базе данных методом Commit объекта транзакции.

Отметим, что соединение должно быть открыто на все время действия транзакции. По умолчанию в ADO.NET соединение "живет" 15 секунд. Чтобы продлить время жизни соединения, добавьте в строку соединения соответствующего объекта OleDbConnection или sqlConnection параметр Connection Lifetime = время, например:

sqlConnectionl.ConnectionString = "data source=PAVLIK-5 0R6ZD;" +

"initial catalog=VUZ;integrated security=SSPI;" +

"persist security info=False;workstation id= PAVLIK -50R6ZD;" +

"packet size=4096; Connection Lifetime=0";

Приравнивание этого параметра к нулю означает неограниченное время соединения, вплоть до его принудительного разрыва методом Close.

Пример. Пусть в базе данных SCHETA хранятся остатки на счетах клиентов-граждан (таблица AccountPerson) и остатки на счетах организаций (таблица AccountOrg). Пусть некий гражданин (код гражданина 111) получает от организации (код организации 2) плату в размере 222 рублей за оказанные услуги.

В рамках транзакции мы должны на означенную сумму:

• увеличить счет гражданина;

• уменьшить счет организации.

Рассмотрим реализацию подобной транзакции средствами ADO.NET.

Примечание. Понятно, что в реальной жизни коды организации и гражданина вряд ли будут помещаться "вживую в текст 8рЬ-запроса" и наверняка станут сообщаться объекту команды данных посредством параметров. В данном случае, чтобы не загромождать пример, мы вставили коды прямо в текст 80^Ь-запросов.


⇐ Предыдущая страница| |Следующая страница ⇒