Автоматическое управление транзакциями
Любая операция с базой данных должна выполняться в контексте транзакции. В своих примерах я постоянно использовал метод OleDbConnection.BeginTransaction(), так как предпочитаю всегда явно управлять транзакциями.
IBProvider может управлять транзакциями автоматически. Для конфигурирования этого режима существуют несколько свойств инициализации, которые могут быть заданы в строке подключения:
auto_commit Допустимые значения: true, false Значение по умолчанию: false Включает режим автоматического управления транзакциями. По умолчанию false |
auto_commit_level Допустимые значения: Read Comitted, Repeatable Read, Snapshot Значение по умолчанию: Repeatable Read Задает уровень изоляции автоматических транзакций. По умолчанию Repeatable Read. В ADO .Net уровни изоляции транзакций определены в перечислении IsolationLevel |
auto_commit_ddl Значение по умолчанию: 0 Допустимые значения: 0 - Поддержка DDL запросов отключена 1- Выполнять DDL запрос в выделенной транзакции. Игнорируется если установлено свойство auto_commit 2- Выполнять CommitRetaining после DDL запроса. Игнорируется если установлено свойство auto_commit Определяет режим выполнения DDL запросов |
auto_commit_ddl_level Допустимые значения: Read Comitted, Repeatable Read, Snapshot Значение по умолчанию: Read Commited Задает уровень изоляции автоматических транзакций для DDL запросов. |
ПРИМЕЧАНИЕDDL запросы (CREATE/ALTER/DROP) позволяют управлять сущностями базы данных: таблицами, триггерами, хранимые процедуры и т.п. |
Следующий пример демонстрирует включение режима автоматического управления транзакциями с уровнем изоляции RepeatableRead:
public void AutoCommitSessionTest() { OleDbConnectionStringBuilder builder = ConnectionProvider.GetConnectionStringBuilder(); builder.Add("auto_commit", true); builder.Add("auto_commit_level", Convert.ToInt32(System.Data.IsolationLevel.RepeatableRead));
OleDbConnection con = new OleDbConnection(builder.ToString()); con.Open();
OleDbCommand cmd = new OleDbCommand("select count(*) from employee", con); Assert.IsTrue((int)cmd.ExecuteScalar() > 0);
con.Close(); }