Я не думаю, что вы можете смешивать использование точек сохранения в скриптах и в C #. Я выполняю следующий SQL:
BEGIN TRANSACTION
INSERT INTO Foos (Fooname)
VALUES ('Bar1')
SAVE TRANSACTION MySavePoint;
INSERT INTO Foos (FooName)
VALUES ('Bar2')
ROLLBACK TRANSACTION MySavePoint
COMMIT TRANSACTION
Это будет работать в SQL и работать со следующим кодом:
using (SqlConnection conn = new SqlConnection("connectionString"))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
using (SqlCommand comm = new SqlCommand("The Above SQL", conn, trans))
{
comm.ExecuteNonQuery();
trans.Commit();
}
}
Если вы попытаетесь набрать trans.Rollback("MySavePoint");
, то произойдет сбой, поскольку объект trans
не контролирует точку сохранения - он не знает об этом.
Если вы разбили SQL на две независимые вставки и используете следующий код:
using (SqlConnection conn = new SqlConnection("connectionString"))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
using (SqlCommand comm1 = new SqlCommand("INSERT INTO Foos(fooName) VALUES('Bar1')", conn, trans))
using (SqlCommand comm2 = new SqlCommand("INSERT INTO Foos(fooName) VALUES('Bar2')", conn, trans))
{
comm1.ExecuteNonQuery();
trans.Save("MySavePoint");
comm2.ExecuteNonQuery();
trans.Rollback("MySavePoint");
trans.Commit();
}
}
Это будет работать так, как вы ожидаете.
Просто примечание, всегда располагайте объектами, которые реализуют IDisposable
- предпочтительно в операторе using
.
Дальнейшее чтение:
http://www.davidhayden.com/blog/dave/archive/2005/10/15/2517.aspx
Обновление: после недолгого использования этого примера кода, похоже, что из-за ошибки, исходящей из SQL, транзакция откатывается и становится непригодной для использования. Как было сказано в другом ответе, похоже, что в сочетании с SQL транзакция принудительно откатывается независимо от точек сохранения из-за определенных ошибок. Единственный выход для этого - переупорядочить команды, запущенные для базы данных, и не полагаться на точки сохранения, или, по крайней мере, не полагаться на то, что это действие находится в точке сохранения.