Вы изучали использование System.Transactions.TransactionScope? Он предназначен для обработки этого типа сценария implicitly без необходимости писать собственный код.
Если вы собираетесь использовать явное управление транзакциями, не используя System.Transactions, вам придется передать объект транзакции (или каким-то образом сделать его доступным), и вам нужно будет решить, когда начать транзакцию. например проверьте, является ли SqlTransaction нулевым, и если так начать транзакцию, просто используйте существующую транзакцию.
Вы могли бы сделать что-то вроде этого (обработка ошибок для transaction.Rollback() опущен):
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;
}
Но, как правило, вы бы просто создать вашу сделку и передать его в другие методы с пониманием, что это уже были инициализированы и безопасны в использовании.
Как я могу проверить, является ли транзакция нулевой? – Mark