Вы смотрели на использование System.Transactions.TransactionScope ? Он предназначен для обработки сценариев этого типа неявно без необходимости написания пользовательского кода.
Если вы собираетесь использовать явное управление транзакциями без использования System.Transactions, вам нужно будет передать объект транзакции (или каким-то образом сделать его доступным), и вам нужно будет решить, когда начинать транзакцию. например проверьте, имеет ли значение SqlTransaction значение null, и, если это так, запустите транзакцию, в противном случае просто используйте существующую транзакцию.
Вы могли бы сделать что-то вроде этого (Обработка ошибок для транзакции. Функция возврата () опущена):
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlTransaction transaction = null;
DoSomething(connection, ref transaction);
DoSomethingElse(connection, ref transaction);
transaction.Commit();
}
public void DoSomething(SqlConnection connection, ref SqlTransaction transaction)
{
SqlCommand command = connection.CreateCommand();
transaction = GetTransaction(connection, transaction);
command.Connection = connection;
command.Transaction = transaction;
...
}
public void DoSomethingElse(SqlConnection connection, ref SqlTransaction transaction)
{
...
}
public SqlTransaction GetTransaction(SqlConnection connection, SqlTransaction transaction)
{
if (transaction == null)
{
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
}
return transaction;
}
Но обычно вы просто создаете свою транзакцию и передаете ее другим методам, понимая, что она уже инициализирована и безопасна для использования.