iT邦幫忙

0

Transaction Rollback奇怪現像

  • 分享至 

  • xImage

各位先進好:
  剛才在測試實作Transaction, Commit, Rollback功能,遇到怪怪的現像,上來請教一下。
先放程式碼如下
js

$('#Test3').on('click', function () {
    let photoData = [{
        Title: 'TestTitleAA23',
        UserName: 'TestContentA23',
        Description: "DescriptionA23"
    }, {
        Title: 'TestTitleBB23',
        UserName: 'TestContentB23',
        Description: "DescriptionB23"
    }, {
        Title: 'TestTitleCC23',
        UserName: 'TestContentC23',
        Description: "DescriptionC23"
    }];

    let commentData = [];
    commentData.push({ Subject: "subjectA23", Body: "bodyA23", UserName: "UserNameA23" });
    commentData.push({ Subject: "subjectB23", Body: "bodyB23", UserName: "UserNameB23" });
    let MultiJson3 = [{
        Title: "titleA",
        Content: "contentA",
        photos: photoData,
        comments: commentData
    }, {
        Title: "titleB",
        Content: "contentB",
        photos: photoData,
        comments: commentData
    }, {
        Title: "titleC",
        Content: "contentC",
        photos: photoData,
        comments: commentData
    }];
    $.ajax({
        type: "POST",
        url: "@Url.Action("myTest3")",
        data: JSON.stringify(MultiJson3),
        contentType: "application/json",
        async: false,
        success: function (result) {
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });
    return false;
});

Controller

[HttpPost]
public ActionResult myTest3(List<RootContainer3> RootContainer3)
{
    var RootContainer = RootContainer3;
    using (var dbContextTransaction = context.Database.BeginTransaction())
    {
        try
        {
            for (int i = 0; i < RootContainer[0].photos.Count(); i++)
            {
                RootContainer[0].photos[i].CreatedDate = DateTime.Now;
                context.Photos.Add(RootContainer[0].photos[i]);
                context.SaveChanges();
            }
            for (int i = 0; i < RootContainer[0].comments.Count(); i++)
            {
                RootContainer[0].comments[i].PhotoID = 1;
                context.Comments.Add(RootContainer[0].comments[i]);
            }
            context.SaveChanges();
            //自訂丟出Exception測試Rollback()功能
            throw new ArgumentNullException("message");
            dbContextTransaction.Commit();
        }
        catch (Exception)
        {
            dbContextTransaction.Rollback();
        }
    }
    return View("Create");
}

情境:
原始資料庫有兩張資料表[Photos],[Comments]
原始資料[Photos]有4筆資料,[Comments]有5筆資料

Step1 run Visual Studio IIS 測試以上程式碼不丟Exception資料是否可正常寫入,Photos會寫入3筆新資料,Comments會寫入2筆新資料。
測試結果可以正常寫入,寫入後的資料狀態[Photos]有7筆資料,[Comments]有7筆資料
Setp2 停止Visual Studio IIS,修改程式碼,丟出Exception測試Rollback()功能,重新啓動Visual Studio IIS,按下按鈕測試資料是否可正常Rollback,(註:有修改JS程式碼裡的寫入資料內容),結果把之前step1 [Photos]與[Comments]寫入的資料也一併移除了,反覆測試了多次的結果都一樣。
預期只會Step2的資料沒有寫入或是說Rollback恢復而己,不知道為什麼Step1的資料也會被清掉???

備註:原始資料[Photos]有4筆資料,[Comments]有5筆資料,是由Code First Seed所寫入的測試用資料,並非由我這支程式按鈕事件所寫入的資料。

這怪異的狀況不知道要怎麼處理?
不知道各位大大有沒有相關經驗?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答