Проблемы с TransactionScope при локальных транзакциях
От: shkabi  
Дата: 20.05.09 15:31
Оценка:
Пытаюсь разобраться с работой 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 ведет себя по-разному при локальных и респределенных транзакциях?
Спасибо
Re: Проблемы с TransactionScope при локальных транзакциях
От: drol  
Дата: 20.05.09 18:15
Оценка: 6 (1)
Здравствуйте, shkabi, Вы писали:

S>Есть ли у кого идеи почему TransactionScope ведет себя по-разному при локальных и респределенных транзакциях?


Потому что в Local на "всё стадо" порождаемых транзакций один-единственный SqlConnection. А у него есть несколько вариантов поведения при завершении транзакции. И в частности, по-умолчанию он переходит в autocommit. Судя по табличке с результатами, именно это и наблюдается.

Как лечить ? Покурить соответствующие темы в MSDN, и, в особенности, параметр "Transaction Binding" в connection string.
Re[2]: Проблемы с TransactionScope при локальных транзакциях
От: drol  
Дата: 20.05.09 18:23
Оценка:
Полезная дискуссия на тему: http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/206e0b5d-4dcf-415a-83a8-04ccd90197c4/
Re[3]: Проблемы с TransactionScope при локальных транзакциях
От: drol  
Дата: 20.05.09 19:09
Оценка:
И ещё немного "углублю"

С точки зрения менеджера транзакций, код Ваших функций не эквивалентен.

Local => один ресурс, который участвует в одной или двух транзакциях.
Distributed => три ресурса, каждый участвует не более чем в одной транзакции.

Посему и разница в поведении, которая, в случае Local, ещё и усугубляется зависимостью от устройства механизма смены транзакции "на лету" у ресурса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.