BeginTransaction(IsolationLevel)

Метод начинает транзакцию по заданному соединению с указанным уровнем изоляции транзакции.

Заданный уровень изоляции транзакций распространяется на все SQL-операторы по соединению.

Метод перекрывает уровень транзакций, заданный в строке подключения.

Нельзя изменить уровень изоляции в ходе выполнения транзакции.

Синтаксис
public DbTransaction BeginTransaction(IsolationLevel isolationLevel);

isolationLevel – уровень изоляции транзакции (перечисление System.Data.IsolationLevel)

Допустимые значения: ReadCommitted (Pessimistic), Snapshot (Optimistic).

Примечания

  1. Режим Snapshot можно использовать для задания режима Optimistic только в приложениях, ориентированных на работу исключительно с СУБД ЛИНТЕР.

  2. Режим Snapshot (Optimistic) устарел. Применять не рекомендуется.

Возвращаемое значение

Объект типа System.Data.Common.DbTransaction, представляющий новую транзакцию.

Исключения
InvalidOperationException Соединение не открыто или предыдущая транзакция не закончена.
ArgumentOutOfRangeException Уровень изоляции транзакций не поддерживается.
LinterSqlException Код завершения СУБД ЛИНТЕР не равен 0.
Пример
// C#
using System;
using System.Data;
using System.Data.Common;

class BeginTransactionSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString = "User ID=SYSTEM;Password=MANAGER8;DataSource=LOCAL";
    con.Open();
    // Старт транзакции
    DbTransaction tran = con.BeginTransaction(IsolationLevel.ReadCommitted);
    // Команде необходимо присвоить объекты транзакции и подключения
    DbCommand cmd = factory.CreateCommand();
    cmd.Connection = con;
    cmd.Transaction = tran;
    try
    {
      cmd.CommandText = "insert into auto (personid) values (1001)";
      cmd.ExecuteNonQuery();
      cmd.ExecuteNonQuery();
      // Фиксация транзакции
      tran.Commit();
      Console.WriteLine("В базу данных записаны две строки");
    }
    catch (Exception ex)
    {
      Console.WriteLine("Ошибка фиксации транзакции: {0}", ex.GetType());
      Console.WriteLine("  Сообщение: {0}", ex.Message);
      // Откат транзакции
      try
      {
        tran.Rollback();
      }
      catch (Exception ex2)
      {
        // Данный блок catch должен обработать любые ошибки, которые могут
        // произойти при откате транзакции (например, закрытое соединение)
        Console.WriteLine("Ошибка отката транзакции: {0}", ex2.GetType());
        Console.WriteLine("  Сообщение: {0}", ex2.Message);
      }
    }
    // Освобождение ресурсов
    con.Close();
  }
}