BeginTransaction(IsolationLevel)
Метод начинает транзакцию по заданному соединению с указанным уровнем изоляции транзакции.
Заданный уровень изоляции транзакций распространяется на все SQL-операторы по соединению.
Метод перекрывает уровень транзакций, заданный в строке подключения.
Нельзя изменить уровень изоляции в ходе выполнения транзакции.
Синтаксис
public DbTransaction BeginTransaction(IsolationLevel isolationLevel);
isolationLevel – уровень изоляции транзакции (перечисление System.Data.IsolationLevel)
Допустимые значения: ReadCommitted (Pessimistic), Snapshot (Optimistic).
Примечания
-
Режим Snapshot можно использовать для задания режима Optimistic только в приложениях, ориентированных на работу исключительно с СУБД ЛИНТЕР.
-
Режим 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();
}
}