После некоторого поиска я нашел этот вопрос переполнения стека . Оказывается, вы не можете вкладывать транзакции в ADO.NET. При попытке вы, вероятно, в конечном итоге запускаете две несвязанные транзакции, что приводит к ошибке параллельных транзакций.
Чтобы увидеть, находится ли соединение в данный момент в транзакции, вы можете:
var com = yourConnection.CreateCommand();
com.CommandText = "select @@TRANCOUNT";
var trancount = com.ExecuteScalar();
Возвращает количество вложенных транзакций.
Обратите внимание, что вы можете вкладывать транзакции вручную, без использования объекта SqlTransaction. Например:
var com = yourConnection.CreateCommand();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO TestTable (name) values ('Joe');";
com.ExecuteNonQuery();
com.CommandText = "COMMIT TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "ROlLBACK TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "SELECT COUNT(*) FROM TestTable";
Console.WriteLine("Found {0} rows.", com.ExecuteScalar());
Это печатает 0
, потому что вложенная транзакция была прервана полностью.