Использование именованных точек сохранения
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(); }