各位先進好:
剛才在測試實作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所寫入的測試用資料,並非由我這支程式按鈕事件所寫入的資料。
這怪異的狀況不知道要怎麼處理?
不知道各位大大有沒有相關經驗?