Когда я обновляю базу данных SQL Server 2005 с помощью C#, я хочу использовать вложенную транзакцию SQL. Я попробовал следующий код:
try
{
conn.Open();
cmd.Connection = conn;
cmd.Transaction = conn.BeginTransaction();
////BEGIN TRAN
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "storeprocname";
cmd.Parameters.Add("@xxx", SqlDbType.VarChar, 50);
cmd.Parameters["@xxx"].Value = "string_value";
cmd.ExecuteNonQuery();
if ()
{
cmd.Transaction.Commit();
}
else
{
cmd.Transaction.Rollback();
}
}
catch (Exception ex)
{
cmd.Transaction.Rollback();
}
Приведенный выше код открывает транзакцию и помещает некоторые данные в SQL Server. Он может успешно работать, если введенные мной данные верны. Но если это не так, он обнаруживает следующую ошибку (которая совершенно отличается от той, которую я ожидал):
[System.Data.SqlClient.SqlException] = {"Невозможно выполнить откат updatetransport. Никакой транзакции или точки сохранения с таким именем не найдено.\r\nСчетчик транзакций после EXECUTE указывает на то, что оператор COMMIT или ROLLBACK TRANSACTION отсутствует. Предыдущий счетчик = 1, текущий счетчик = 2."
Код следующий SQL:
begin tran updatetransport
update db set xxx=@xxx where xxx=@xxx
if @@rowcount < 1 or @@error 0 -- no record updated
begin
rollback tran updatetransport /*updatran is the name of transaction*/
return -1 --fail
end
else
begin
commit tran updatetransport
return 0 --success
end
Оказалось, что SQL Server автоматически откатывает транзакцию. И выкидывать ошибку, когда я пытался ее откатить. Однако когда я попытался изменить код следующим образом, все равно безуспешно. Я что-то упускаю?
Я объявил @tcount = @@TRANCOUNT сразу после начала транзакции.
if @tcount = @@TRANCOUNT
begin
rollback tran updatetransport
end
Подробнее здесь: https://stackoverflow.com/questions/307 ... n-with-sql