Мне нужно сделать относительно тривиальную транзакцию, которая, однако, должна влиять на 5-6 таблиц, поэтому я просмотрел несколько руководств о том, как это сделать, поскольку я никогда раньше не использовал транзакции, и я вложил в них обертывание каждого нового запроса при using(...)
блокируйте следующим образом:
SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
connection = new SqlConnection(localConnString);
connection.Open();
string insertSomeValues = "some SQL INSERT query"..
using (SqlCommand command = new SqlCommand(insertSomeValues, connection))
{
..
}
using(SqlCommand newCommand = new SqlCommand(otherQuery, connection))
{
..
}
transaction.Commit();
}
catch
{
transaction.Rollback();
}
finally
{
connection.Close();
}
Поэтому я надеюсь, что у вас есть идея. Проблема, которая, как мне кажется, связана с этой реализацией, заключается в том, что, поскольку блок using
находится в pricatice блоке try-catch
если исключение выбрасывается где-то по пути дальнейшего выполнения кода, и, что более важно, transaction.Commit();
слишком. Это делает транзакцию бесполезной, так как я заканчиваю частично измененной database
когда хочу транзакцию (все или ничего).
Из-за моего отсутствия опыта по этой теме я хотел бы знать, как правильно правильно выполнять такие ситуации. В одном из примеров был флаг bool
указывающий, как прошла текущая операция и до вызова transaction.Commit();
там какая-то проверка:
if (!hasErrors)
{
transaction.Commit();
}
но поскольку я включаю серверные таблицы в свою транзакцию, и у меня есть некоторый запрос, который используется для извлечения информации или проверки чего-либо, идея использования флага не очень заманчива. Я думал об удалении блоков using()
чтобы (по крайней мере, я думаю, что это должно произойти) всякий раз, когда возникает ошибка, я перехожу непосредственно к основному блоку catch. Итак, есть идеи, но каков реальный способ справиться с этим?
Я изменил код ur, включив общую транзакцию для всех команд.
SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
connection = new SqlConnection(localConnString);
connection.Open();
transaction=connection.BeginTransaction();
string insertSomeValues = "some SQL INSERT query"..
using (SqlCommand command = new SqlCommand(insertSomeValues, connection,transaction))
{
..
}
using(SqlCommand newCommand = new SqlCommand(otherQuery, connection,transaction))
{
..
}
transaction.Commit();
}
catch
{
transaction.Rollback();
}
finally
{
connection.Close();
}