Commit
Метод подтверждает текущую транзакцию и завершает её. Используемые ресурсы не освобождаются.
Синтаксис
public abstract void Commit();
Возвращаемое значение
Значение типа void.
Исключения
InvalidOperationException | Транзакция уже завершена (подтверждена/отменена/соединение закрыто). | |
LinterSqlException | Код завершения СУБД ЛИНТЕР не равен 0. |
Пример
// C#
using System;
using System.Data;
using System.Data.Common;
class CommitSample
{
static void Main()
{
// В примере инициируется транзакция и в таблицу auto добавляются две записи с
// одинаковым значением столбца personid
// Если столбец personid не является первичным ключом, запись с дубликатом
// значения добавляется и транзакция завершается успешно.
// Если personid является первичным ключом, то вторая запись нарушает
// целостность БД и транзакция отменяется
DbProviderFactory factory =
DbProviderFactories.GetFactory("System.Data.LinterClient");
DbConnection con = factory.CreateConnection();
con.ConnectionString = "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
con.Open();
DbCommand cmd = factory.CreateCommand();
cmd.Connection = con;
// Проверяем кол-во строк в таблице auto перед началом транзакции
cmd.CommandText = "SELECT COUNT(*) FROM auto";
int AutoCount = int.Parse(cmd.ExecuteScalar().ToString());
// отображаем кол-во строк в таблице auto
Console.WriteLine("Кол-во строк в таблице AUTO = " + AutoCount);
// Начинаем транзакцию
DbTransaction txn = con.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = txn;
try
{
// Добавляем дважды одну и ту же строку
cmd.CommandText = "INSERT INTO auto(personid) VALUES (2000)";
cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery(); // При добавлении дубликата возможно исключение
txn.Commit();
}
catch (Exception e)
{
// Печать диагностического сообщения
Console.WriteLine("Ошибка добавления записи = " + e.Message);
// Отмена транзакции
txn.Rollback();
}
// Проверяем кол-во строк в таблице auto после завершения транзакции
cmd.CommandText = "SELECT COUNT(*) FROM auto";
AutoCount = int.Parse(cmd.ExecuteScalar().ToString());
// Отображаем полученное кол-во строк
// Если столбец personid является первичным ключом, кол-во строк не должно
// измениться, в противном случае должно увеличиться на 2
Console.WriteLine("Кол-во строк в таблице AUTO = " + AutoCount);
txn.Dispose();
cmd.Dispose();
con.Close();
con.Dispose();
}
}
Результат выполнения примера:
Кол-во строк в таблице AUTO = 1001
Ошибка добавления записи = [Linter error] duplicate value for primary or unique key
Кол-во строк в таблице AUTO = 1001