.NET Framework 4.5. Распределенная транзакция завершена. Либо зачислите этот сеанс в новую транзакцию, либо в транзакцию NULL.

Я работаю над проблемой распределенных транзакций, которая возникает с использованием NET Framework 4.5. Если я попытаюсь запустить приложение на машине (а также на Dev Server) с помощью Framework 4.0, компоненты будут работать нормально. Проблема началась, когда я установил fwk4.5 на свою машину и запустил ее. Я установил только фреймворк, я никогда не менял исходный код и не менял целевую фреймворк на сборках.

Мне нужно знать, почему это происходит, если поведение Entity Framework и распределенных транзакций изменилось после fwk4.0.

Много читал, но так и не понял. Любая помощь будет очень признательна.

С уважением, Диего

Здесь вы можете увидеть простой пример кода, в котором я смог воспроизвести ошибку:

Примечание. Обратите внимание, что если соединение ObjectContext не открывается вручную перед транзакцией, оно работает нормально.



public static bool DoTran_ObjectContext()
        {
            String strc = ConfigurationManager.ConnectionStrings["TestDB2Entities"].ConnectionString; //"metadata=res://*/TestDb2Model.csdl|res://*/TestDb2Model.ssdl|res://*/TestDb2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=.\sqlexpress;initial catalog=TestDB2;integrated security=True;pooling=False;multipleactiveresultsets=True;application name=EntityFramework""
            ObjectContext oc = new ObjectContext(strc);

            //this line causes enlist error at the end of function/////
            oc.Connection.Open();
            ///////////////////////////////////////////////

            var t = (from s in oc.CreateObjectSet() where s.Id == 2 select s).FirstOrDefault();

            t.Valor = "Cambiado_" + DateTime.Now;

            using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
            {

                String cstr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; //"Data Source=.\\sqlexpress;Initial Catalog=TestDB2;Integrated Security=True";
                System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cstr);
                conn.Open();
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "insert into Tabla1_Db2 values('" + DateTime.Now.ToString() + "')";

                SqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
                cmd.Transaction = tran;
                cmd.ExecuteNonQuery();

                tran.Commit();
                conn.Close();

                oc.SaveChanges();

                scope2.Complete();
            }

            //On this line the error is thrown
            var t2 = (from s in oc.CreateObjectSet() where s.Id == 2 select s).FirstOrDefault();

            return true;
        }

Ошибка:

"Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction."

Спасибо!


person DPG    schedule 06.05.2013    source источник


Ответы (1)