SubSonic2.2 SharedDbConnectionScope и TransactionScope Путаница транзакций - PullRequest
3 голосов
/ 25 августа 2009

ARGH !!!

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

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

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

Тогда другой вопрос, такой как Subsonic: использование 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 какому-либо правильному пути?

Ответы [ 2 ]

4 голосов
/ 25 августа 2009

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

0 голосов
/ 04 сентября 2009

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

...