Chủ nhật, ngày 25 tháng 2 năm 2018

LINQ-Phần 3: Thực thi dữ liệu với Transaction

Ngày đăng: 4/7/2011, 8:5:36AM | Lượt xem: 8,499
Hot!

Trong hai phần trước mình đã giới thiệu cách truy vấn và thực thi csdl vói Linq. Trong phần này mình sẻ giới thiệu các thực thi dữ liệu với Transaction trong Linq. Để có đủ nền tảng tìm hiểu về Linq tôi nghĩ bạn đã tìm hiểu về SQL rồi. Vì vậy ở đây tôi không đề cập đến Transaction là gì, công dụng, tham số, cũng như các thuộc tính kèm theo.

Như đã biết Transaction là sự hợp nhất nhiều công việc thành một khối công việc. Khối công việc này được xem là hoàn tất khi tất cả các công việc đều hoàn tất. Và ngược lại, nếu một trong các công việc thất bại thì khối công việc được xem như chưa thất bại. Trong Linq, mặc định sẻ khởi tạo Transaction khi ta gọi SubmitChange(), Như vậy tất cả các công việc được xem là hoàn tất khi ban gọi SubmitChange() thành công. SubmitChange được xem như là lệnh Commit trong SQL Transaction). Và các câu lệnh xem như là một khối lệnh. Hãy xem đoạn code bên dưới, ta chỉ thêm mới detail_1 và detail_2 thành công khi gọi SubmitChange() thành công, nếu đổi detail_2.ProductID = 6 thì SubmitChange() sẻ không thành công và Exception sẻ sảy ra(mặc định của NorthWind không cho sản phẩm trùng nhau trong cùng một hóa đơn).

NorthwindDataContext context = new NorthwindDataContext();
Order order = context.Orders.Single(o => o.OrderID == 10248);

Order_Detail detail_1 = new Order_Detail();
detail_1.OrderID = 10248;
detail_1.ProductID = 6;
detail_1.Quantity = 6;
detail_1.UnitPrice = 6;
detail_1.Discount = 0;
order.Order_Details.Add(detail_1);

Order_Detail detail_2 = new Order_Detail();
detail_2.OrderID = 10248;
detail_2.ProductID = 7;//6 detail_2.Quantity = 7;
detail_2.UnitPrice = 7;
detail_2.Discount = 0;
order.Order_Details.Add(detail_2);

context.SubmitChanges();

Để kiểm soát SubmitChange ta sử dụng TransactionScope hoặc DbTransaction. Tất cả các khối lệnh được xem là thành công khi bạn gọi TransactionScope.Complete() hoặc DbTransaction.Commit(). Hai đoạn code sau minh họa cách sử dụng đối tương TransactionScope và DbTransaction.

//Transaction sư dụng DbTransaction

NorthwindDataContext context = new NorthwindDataContext();
try
{
context.Connection.Open();
System.Data.Common.DbTransaction transaction = context.Connection.BeginTransaction();
context.Transaction = transaction;

Order order = context.Orders.Single(o => o.OrderID == 10248);
Order_Detail detail_1 = new Order_Detail();
detail_1.OrderID = 10248;
detail_1.ProductID = 6;
detail_1.Quantity = 6;
detail_1.UnitPrice = 6;
detail_1.Discount = 0;
order.Order_Details.Add(detail_1);
context.SubmitChanges();

Order order2 = context.Orders.Single(o => o.OrderID == 10248);
Order_Detail detail_2 = new Order_Detail();
detail_2.OrderID = 10248;
detail_2.ProductID = 7;//6 detail_2.Quantity = 7;
detail_2.UnitPrice = 7;
detail_2.Discount = 0;
order2.Order_Details.Add(detail_2);
context.SubmitChanges();

context.Transaction.Commit();
MessageBox.Show("Complete");
}
catch (Exception ex)
{
context.Transaction.Rollback();
MessageBox.Show(ex.Message);
}

//Transaction sử dụng TransactionScope. Một điều nên chú ý. Khi sử dụng TransactionScope thì không có RollBack(). Vì lệnh này sẻ tự động thực hiện khi thoát khỏi phạm vi của nó (Scope) mà không gọi Complete().

try
{
using (var transaction = new TransactionScope())
{
NorthwindDataContext context = new NorthwindDataContext();

Order order = context.Orders.Single(o => o.OrderID == 10248);
Order_Detail detail_1 = new Order_Detail();
detail_1.OrderID = 10248;
detail_1.ProductID = 6;
detail_1.Quantity = 6;
detail_1.UnitPrice = 6;
detail_1.Discount = 0;
order.Order_Details.Add(detail_1);
context.SubmitChanges();

Order order2 = context.Orders.Single(o => o.OrderID == 10248);
Order_Detail detail_2 = new Order_Detail();
detail_2.OrderID = 10248;
detail_2.ProductID = 7;//6 detail_2.Quantity = 7;
detail_2.UnitPrice = 7;
detail_2.Discount = 0;
order2.Order_Details.Add(detail_2);
context.SubmitChanges();

transaction.Complete();
MessageBox.Show("Complete");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
ca do bong da online
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.