TransactionScope работает в некоторых местах, а не в других - PullRequest
4 голосов
/ 11 марта 2010

Использование ASP.NET 3.5, Linq to SQL, SQL Server 2005 на Windows Server 2003. Локальный запуск VS 2008 на XP SP3.

Мы должны иметь возможность заключать в транзакции вставки, обновления и удаления. Когда мы впервые попробовали это, обернув блоки кода с using(var trans = new TransactionScope()) { ...; trans.Complete(); }, мы получили соответствующее исключение, говорящее нам, что нам нужно включить сетевой доступ для удаленных транзакций. Мы так и сделали , и все стало работать так, как мы ожидали.

Перенесемся в сегодня. В нашем приложении есть малоиспользуемая часть, которая также получила лечение TransactionScope. Хотя транзакции работают должным образом во всех других частях нашей кодовой базы, сегодня мы обнаружили, что этот редко используемый компонент вызывает то же исключение «Доступ к сети», что и раньше:

Доступ к сети для диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов. http://img101.imageshack.us/img101/5480/msdtcnetworkaccesserror.jpg

Вот код, вызывающий исключение:

        using (TransactionScope trans = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
        {
            using (var dc = new ChargeXferDataContext())
            {
                //create 'Line' object and set initial values
                Line line = new Line();
                line.Unit_Num = UnitId;
                line.SubmittedBy = Viewer.Alias();
                line.LineSubmittedOn = DateTime.Now;

                //get codes to move from checked rows
                //iterate rows in current gridview
                foreach (GridViewRow row in gv.Rows)
                {
                    //if checked, insert move order
                    HtmlInputCheckBox cb = (HtmlInputCheckBox)row.FindControl("RowLevelCheckBox");
                    if (cb.Checked)
                    {

                        //1st: get required values
                        int id = Convert.ToInt32(((TextBox)row.FindControl("fldCodeId")).Text);
                        int newId = Convert.ToInt32(((DropDownList)row.FindControl("ddlNewId")).SelectedValue);
                        char newPOA = Convert.ToChar(((DropDownList)row.FindControl("ddlPOA")).SelectedValue);

                        //2nd: get current diag code from old patient
                        //######## Exception happens here...
                        DiagCode code = dc.DiagCodes.SingleOrDefault(c => c.Id == id);
                        //########

                        //3rd: add code to emenline object
                        addCode(line, code, newId, newPOA);

                    }
                }
                dc.SubmitChanges();
                trans.Complete();
            }
        }                       

Если у вас есть какие-либо предложения, они будут оценены. Дайте мне знать, если я могу объяснить что-то еще. Заранее спасибо !!

1 Ответ

1 голос
/ 02 апреля 2010

Я так и не нашел решение этой проблемы. Перешел с жизнью.

...