TransactionScope, включающий DbTransaction, созданную до входа в область - PullRequest
2 голосов
/ 04 января 2011

Мы использовали DAAB для некоторых устаревших бизнес-объектов, и теперь мы решили использовать TransactionScope для некоторых новых бизнес-объектов. Теперь мы должны вызвать новый бизнес-объект в старом коде бизнес-объекта. Старый код бизнес-объекта будет выглядеть так, когда в нем вызывается новый бизнес-объект:

Database db = DatabaseFactory.CreateDatabase();
// create connection instance
DbConnection dbConnection = db.CreateConnection();
dbConnection.Open(); // open connection
// create transaction instance & start the transaction
DbTransaction dbTransaction = dbConnection.BeginTransaction();

// do some old business object insert/update

// now call the new business object
newBO.Update();

// commit transaction
dbTransaction.Commit();

Новый бизнес-объект содержит следующий код:

using (TransactionScope scope = new TransactionScope())
{
    // do some update/insert
    scope.Complete();
}

Вопрос в том, будет ли это работать?

Мое нынешнее убеждение заключается в том, что оно будет работать на основе:

  1. эта статья MSDN , в которой говорится, что если транзакция была создана вне области действия, то создатель транзакции по-прежнему отвечает за фиксацию / откат ее - что в принципе и является моим случаем , это будет отлично работать, если это правда.
  2. частичная трассировка TransactionScope, которую я выполняю, также указывает, что фиксация не обязательно фиксируется при утилизации TransactionScope, но я не смог полностью завершить трассировку, поэтому я не уверен на 100%, была ли моя трассировка точной

Однако есть несколько статей о TransactionScope, включая это сообщение о SO , в котором не упоминается этот сценарий, а просто говорится, что транзакция (-ы) будет откатываться без указания, была ли создана транзакция. самим TransactionScope или нет.

Итак, мой вопрос: из вашего опыта, в чем дело?

a) транзакция, созданная за пределами TransactionScope, передается при утилизации области действия

OR

b) транзакция, созданная за пределами TransactionScope, не была передана в распоряжение, и создатель должен позаботиться об откате и фиксации?

1 Ответ

0 голосов
/ 04 января 2011

Ответ - B. Однако вы должны помнить, что TransactionScope создает транзакцию на уровне распределенной системы, используя MSDTC, в то время как транзакция БД создается в БД

.
...