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 какому-либо правильному пути?