Работа с транзакциями

это можно сделать внутри sql

Иногда вам требуется возможность исполнять несколько команд в пределах области действия единственной транзакции с базой данных, чтобы в случае, когда любая из команд терпит неудачу, терпели неудачу они все, и никаких изменений в базе данных не производилось бы. Это можно сделать внутри SQL Server и других баз данных, начиная транзакцию внутри сохраняемой процедуры и фиксируя либо откатывая ее в зависимости от результатов запросов, инкапсулированных внутри процедуры. Однако иногда вам нужно контролировать транзакцию из вашего кода ADO. NET, заключив в одну транзакцию исполнение нескольких команд. Сделать это довольно просто. Вы можете использовать класс SqlTrans — Action в сочетании с соединением, чтобы управлять транзакцией из своего кода доступа к данным. Допустим, например, что вы хотите написать код, который сначала проверял бы, существует ли строка, и если существует, то делал какие-то модификации этой строки. Давайте также допустим, что вам нужно это сделать посредством двух явных текстовых SQL-запросов из вашего управляемого кода. Вы хотите написать непробиваемый код, поэтому должны быть уверены, что строка, которая будет подвергаться обновлению, не будет модифицирована или удалена другим клиентом или запросом в промежутке между моментом, когда вы проверяете ее существование, и моментом, когда вы ее обновляете. Использование транзакции с соответствующим уровнем изоляции отлично подойдет для такого сценария. Взгляните на код в листинге Г.9.

Здесь следует обсудить несколько моментов. Первый — как создать и применить транзакцию. Код создает соединение и объекты команд, как вы уже видели раньше. Транзакция создается вызовом BeginTransaction Для соединения с необязательной спецификацией уровня изоляции. Уровень изоляции по умолчанию — ReadCommitted, Но чтобы гарантировать, что никто не сможет модифицировать запись после того, как она была прочитана оператором SELECT, вам нужен ReadRe — Peatable.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *