Руководство по работе с БД Firebird с использованием библиотеки ADO .Net 2.0

Использование именованных точек сохранения


IBProvider позволяет использовать именованные точки сохранения внутри транзакций. Для задания новой точки необходимо выполнить SQL запрос:

SAVEPOINT save_point_name

Для того, чтобы откатить или зафиксировать транзакцию до определенной точки сохранения, необходимо выполнить:

ROLLBACK TO SAVEPOINT save_point_name или COMMIT TO SAVEPOINT save_point_name

В следующем примере определяется одна точка сохранения между двумя командами:

public void SavePointTest() { OleDbConnection con1 = ConnectionProvider.CreateConnection(); con1.Open();

OleDbTransaction transaction = con1.BeginTransaction();

OleDbCommand cmd_insert = new OleDbCommand( "insert into country (country,currency) values (:country,:currency)", con1, transaction); cmd_insert.Parameters.AddWithValue(":country", "Russia"); cmd_insert.Parameters.AddWithValue(":currency", "Ruble"); Assert.AreEqual(1, cmd_insert.ExecuteNonQuery());

new OleDbCommand("SAVEPOINT AFTER_INSERT_POINT", con1, transaction).ExecuteNonQuery();

//delete country in using 3-level internal transaction context

OleDbCommand cmd_delete = new OleDbCommand( "delete from country where country=?", con1, transaction); cmd_delete.Parameters.AddWithValue("?", "Russia"); Assert.AreEqual(1, cmd_delete.ExecuteNonQuery());

new OleDbCommand("ROLLBACK TO SAVEPOINT AFTER_INSERT_POINT", con1, transaction).ExecuteNonQuery();

//check what record was not deleted but existing in database

OleDbCommand cmd_check = new OleDbCommand( "select count(*) from country where country=?", con1, transaction);

cmd_check.Parameters.AddWithValue("?", "Russia"); Assert.AreEqual(1, cmd_check.ExecuteScalar());

transaction.Rollback(); con1.Close(); }



Содержание раздела