Вложенные TransactionScopes в хранимых процессах CLR - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть сохраненная процедура CLR, и у меня есть внешняя транзакция и несколько внутренних транзакций, но когда я запускаю код, а внутренняя транзакция не вызывает Complete, он все еще вводит данные.

Внутреннее использование TransactionScopes требует Новые.

Есть идеи, почему, код ниже?

[код]

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCreateAllocations(int campaignid, string product, DateTime startdate, double rate, int numweeks, int bonuses, string umguser)
{
    using (TransactionScope trans = new TransactionScope())
    using (SqlConnection connection = new SqlConnection("context connection=true"))
    {
        string sql = "";
        DateTime actualStart;

        actualStart = GetActualStartDate(startdate);

        connection.Open();

        int hdrid = CreateAllocationHeader(connection, campaignid, rate, numweeks, bonuses, umguser);

        sql = "SELECT * FROM VenuePanels WHERE SelectRow<>0";

        SqlDataAdapter adp = new SqlDataAdapter(sql, connection);
        DataTable dt = new DataTable();

        adp.Fill(dt);

        if (dt.Rows.Count == 0)
            return;

        bool allocated = false;

        foreach (DataRow dr in dt.Rows)
        {
            for (int i = 1; i <= numweeks + bonuses; i++)
            {
                if (i <= numweeks)
                    allocated = ProcessPanel(connection, hdrid, campaignid, dr, actualStart.AddDays(7 * (i - 1)), rate, numweeks, false, umguser);
                else
                    allocated = ProcessPanel(connection, hdrid, campaignid, dr, actualStart.AddDays(7 * (i - 1)), rate, numweeks, true, umguser);
                if(!allocated)
                    throw new Exception("ERROR: These panels have already been allocated. Please Check the panel allocations!");
            }
        }

        ProcessBursts(connection, hdrid, dt, campaignid, product, umguser);

        //throw new Exception("Buggin out Here");

        LogAllocationErrors(connection);

        trans.Complete();
    }
}

private static void ProcessBursts(SqlConnection connection, int hdrid, DataTable dtPanels, int campaignid, string product, string umguser)
{
    LoadBursts(connection, campaignid, product);
    bool burstallocated = false;
    bool bonusallocated = false;
    int lastweek = 0;

    foreach (DataRow dr in dtPanels.Rows)
    {
        foreach (Burst burst in _bursts)
        {
            using (TransactionScope trans = new TransactionScope(TransactionScopeOption.RequiresNew))
            {
                for (int i = 1; i <= burst.NumWeeks + burst.Bonuses; i++)
                {
                    if (i <= burst.NumWeeks)
                        burstallocated = ProcessPanel(connection, hdrid, burst.CampaignID, dr, burst.StartDate.AddDays(7 * (i - 1)), burst.Rate, burst.NumWeeks, false, umguser);
                    else
                        bonusallocated = ProcessPanel(connection, hdrid, burst.CampaignID, dr, burst.StartDate.AddDays(7 * (i - 1)), burst.Rate, burst.NumWeeks, true, umguser);
                    if (!burstallocated)
                    {
                        lastweek = i;
                        break;
                    }
                }

                if (burstallocated)
                    trans.Complete();
                else
                    LogAllocationError(Convert.ToInt32(dr["PanelID"]), burst.CampaignID, lastweek, burst.NumWeeks, burst.Bonuses);
            }
        }
    }
}

[/ код]

1 Ответ

0 голосов
/ 09 декабря 2010
...