Вопрос

ААА!!!

Кажется, существует небольшая путаница вокруг объектов SharedDbConnectionScope и TransactionScope, позволяющих включать запросы SubSonic в транзакцию.

В документации предлагается указать использование SharedDbConnectionScope, обернутое вокруг использования TransactionScope...

using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
{
  using(TransactionScope ts = new TransactionScope())
  {
    // do something
    ts.Complete();
  }
}

Тогда другой вопрос здесь, например Дозвуковой:Использование SharedDbConnectionScope вместе с TransactionScope кажется нарушенным предполагают, что документы неверны, и два объекта должны быть наоборот...

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
  {
    // do something
    ts.Complete();
  }
}

Но заглянув в исходный код, я запутался еще больше.

В файле кода SqlQuery.cs имеется несколько перегрузок ExecuteTransaction.Например...

public static void ExecuteTransaction(List<SqlQuery> queries)
{
  using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
  {
    using(TransactionScope ts = new TransactionScope())
    {
      foreach(SqlQuery q in queries)
        q.Execute();
    }
  }
}

Хм...Интересный...Соответствует документам, но... Где вызов ts.Complete()?

Как это должно зафиксировать транзакцию?Насколько я понимаю, он всегда будет откатываться.И это одинаково для всех перегрузок ExecuteTransaction!

Но вот настоящий удар...

В коде TransactionWithDtcOffTests.cs есть несколько хороших тестов, за исключением того, что они настроены SharedDbConnectionScope и TransactionScope по-другому!

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope connScope = new SharedDbConnectionScope())
  {
    // <snip />
  }
}

У меня не было возможности запустить тесты SubSonic 2.2, но я предполагаю, что у кого-то была возможность, и они прошли..

Окончательно...

Может ли кто-нибудь дать мне окончательный ответ на вопрос, как следует настраивать транзакции в SubSonic2.2?Действительно ли документы неверны?Соответствует ли источник перегрузок и тестов ExecuteTransaction тому пути, который действительно верен?

Это было полезно?

Решение

Блок SharedConnectionScope (SCS) должен находиться внутри TransactionScope (TS).Целью SCS является предотвращение эскалации транзакции в MSDTC, если это возможно, поэтому использование блока TS using внутри блока using SCS для меня не имеет особого смысла.В любом случае каждый блок TS должен иметь вызов Complete() для фиксации транзакции.

Другие советы

Лично я обнаружил, что при использовании SQL 2005 SCS должен быть внутри TS и при использовании SQL 2000 (с MSDTC), SCS должен обернуть TS.Надеюсь, это поможет...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top