Пытаюсь разобраться с работой TransactionScope. Для этого создал следующий код, который проверяет поведение TransactionScope с локальными и распределенными транзакциями с различными TransactionScopeOptions и вариантами завершения транзакции:
public void Local(TransactionScopeOption scopeOption, bool completeRoot, bool completeNested)
{
using (TransactionScope scope1 = new TransactionScope())
{
using(SqlConnection conn = new SqlConnection("...")){
conn.Open();
Insert(1, conn);//Inserts a value into a database using specified connection;
using (TransactionScope scope2 = new TransactionScope())
{
Insert(2, conn);//Insert a value into a database using specified connection;
if (completeNested)
scope2.Complete();
}
Insert(3, conn);//Insert a value into a database using specified connection;
if (completeRoot)
scope1.Complete();
}
}
}
public void Distributed(TransactionScopeOption scopeOption, bool completeRoot, bool completeNested)
{
using (TransactionScope scope1 = new TransactionScope())
{
InsertToDB1(1);//Creates a connection to DB1 and inserts a value;
using (TransactionScope scope2 = new TransactionScope())
{
InsertToDB2(2);//Creates a connection to DB2 and inserts a value;
if (completeNested)
scope2.Complete();
}
InsertToDB3(3);//Creates a connection to DB3 and inserts a value;
if (completeRoot)
scope1.Complete();
}
}
Я использую SQL Server 2005. TransactionScope работает предсказуемо с распределенными транзакциями, однако когда используется локальная транзакция TransactionScope ведет себя непонятно. Результаты с таблице, которую можно посмотреть по следующей ссылке
здесь http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/78c6f17c-c612-4aa7-82c0-34a8ad69c07c . Она включает список значений, записаных в базу, при различных вариантах:
Есть ли у кого идеи почему TransactionScope ведет себя по-разному при локальных и респределенных транзакциях?
Спасибо
И ещё немного "углублю"
С точки зрения менеджера транзакций, код Ваших функций не эквивалентен.
Local =>
один ресурс, который участвует
в одной или двух транзакциях.
Distributed =>
три ресурса, каждый участвует
не более чем в одной транзакции.
Посему и разница в поведении, которая, в случае Local, ещё и усугубляется зависимостью от устройства механизма смены транзакции "на лету" у ресурса.