Добавить в цитаты Настройки чтения

Страница 401 из 642

  IDbCo

  IsolationLevel IsolationLevel { get; }

  void Commit();

  void Rollback();

}

Обратите внимание на свойство Co

На заметку! Свойство IsolationLevel объекта транзакции позволяет указать, насколько активно транзакция должна защищаться от действий со стороны других параллельно выполняющихся транзакций. По умолчанию транзакции полностью изолируются вплоть до их фиксации.

Помимо членов, определенных в интерфейсе IDbTransaction, тип SqlTransaction определяет дополнительный член под названием Save(), который предназначен для определения точек сохранения. Такая концепция позволяет откатить отказавшую транзакцию до именованной точки вместо того, чтобы осуществлять откат всей транзакции. При вызове метода Save() с использованием объекта SqlTransaction можно задавать удобный строковый псевдоним, а при вызове Rollback() этот псевдоним можно указывать в качестве аргумента для выполнения частичного отката. Вызов Rollback() без аргументов приводит к отмене всех ожидающих изменений.

Добавление метода транзакции в inventoryDal

Давайте посмотрим, как работать с транзакциями ADO.NET программным образом. Начните с открытия созданного ранее проекта библиотеки кода AutoLot.Dal и добавьте в класс InventoryDal новый открытый метод по имени ProcessCreditRisk(), предназначенный для работы с кредитными рисками. Метод будет искать клиента, в случае нахождения поместит его в таблицу CreditRisks и добавит к фамилии метку "(Credit Risk)".

public void ProcessCreditRisk(bool throwEx, int customerId)

{

  OpenCo

  // Найти имя текущего клиента по идентификатору.

  string fName;

  string lName;

  var cmdSelect = new SqlCommand(

    "Select * from Customers where Id = @customerId",

    _sqlCo

  SqlParameter paramId = new SqlParameter

  {

    ParameterName = "@customerId",

    SqlDbType = SqlDbType.Int,

    Value = customerId,

    Direction = ParameterDirection.Input

  };

  cmdSelect.Parameters.Add(paramId);

  using (var dataReader = cmdSelect.ExecuteReader())

  {

    if (dataReader.HasRows)

    {

      dataReader.Read();

      fName = (string) dataReader["FirstName"];

      lName = (string) dataReader["LastName"];

    }

    else

    {

      CloseCo

      return;

    }

  }

  cmdSelect.Parameters.Clear();

  // Создать объекты команды, представляющие каждый шаг операции.

  var cmdUpdate = new SqlCommand(

    "Update Customers set LastName = LastName + ' (CreditRisk) '

     where Id = @customerId", _sqlCo

  cmdUpdate.Parameters.Add(paramId);

  var cmdInsert = new SqlCommand(

     "Insert Into CreditRisks (CustomerId,FirstName, LastName)

      Values( @CustomerId, @FirstName, @LastName)", _sqlCo

  SqlParameter parameterId2 = new SqlParameter

  {

    ParameterName = "@CustomerId",

    SqlDbType = SqlDbType.Int,

    Value = customerId,

    Direction = ParameterDirection.Input

  };

  SqlParameter parameterFirstName = new SqlParameter

  {

    ParameterName = "@FirstName",

    Value = fName,

    SqlDbType = SqlDbType.NVarChar,

    Size = 50,

    Direction = ParameterDirection.Input

  };

  SqlParameter parameterLastName = new SqlParameter

  {

    ParameterName = "@LastName",

    Value = lName,

    SqlDbType = SqlDbType.NVarChar,

    Size = 50,