24/05/2014

Hướng dẫn quản lý Transaction(giao tác) trong C#

Transaction là cái gì?

Transaction (giao tác) là 1 tập các hành động cùng thực hiện 1 chức năng, và chúng chỉ có thể cùng nhau thành công, hoặc cùng nhau thất bại.

Ví dụ:
Ngân hàng của Soda muốn tăng lãi suất tiền gởi cho 1000 khách hàng. Do đó, Soda phải cập nhật 1000 record trong cơ sở dữ liệu. Tuy nhiên, trong khi server cập nhật đến record thứ 500 thì bị... cúp điện. Kết quả, chỉ có 500 khách hàng được tăng, 500 khách hàng còn lại ngồi chờ Soda... xin lỗi.
Chờ đến khi có điện, Soda sẽ có 2 lựa chọn: một là quay lùi, bỏ việc cập nhật cho 500 record đầu tiên, hai là cập nhật tiếp 500 record còn lại.

- Việc cập nhật 1000 record như trên được gọi là một Transaction (giao tác)
- Việc quay lùi, bỏ cập nhật 500 record đầu tiên, được gọi là quá trình Rollback (quay lùi)
- Việc tiếp tục cập nhật 500 record còn lại, được gọi là quá trình Commit (tạm dịch là "cam kết")

Chúng ta có thể lập trình để một Transaction luôn hoàn tất, hoặc luôn thất bại. Thông thường, ta sử dụng Transaction cho các câu lệnh SQL insert, update, delete trong cơ sở dữ liệu. Nếu đang thực hiện mà bị mất điện hay treo máy, thì khi hệ thống hoạt động lại, bộ quản lý Transaction sẽ tự động thực hiện điều này mà không cần người dùng phải nhúng tay vào.

Bạn có thể lập trình với Transaction bên trong hệ quản trị cơ sở dữ liệu (ví dụ, viết bên trong StoreProcedure của SQL Server). Hoặc bạn có thể lập trình ngay trong ứng dụng của mình, thông qua đối tượng Transaction của ADO.NET.

Bài viết này giới thiệu vấn đề lập trình Transaction với đối tượng Transaction của ADO.NET. Vấn đề Transaction trong StoreProcedure xin được giới thiệu trong 1 dịp khác.

Học qua ví dụ

Giả sử chúng ta muốn sử dụng Transaction cho một câu lệnh SQL (hoặc 1 StoreProcedure) thực hiện việc cập nhật nhiều bản ghi đồng thời. Các bước thực hiện như sau:

- Bước 1: thêm gói chứa đối tượng Transaction

Visual C# Code:
  1. using System.Data.SqlClient;

- Bước 2: kết nối CSDL, chuẩn bị truy xuất dữ liệu

  1. SqlConnection cnn = new SqlConnection(<chuỗi kết nối CSDL>);
  2. {
  3.     cnn.Open();    //mở kết nối
  4. }
  5. catch(Exception e)
  6. {
  7.     //xử lý lỗi kết nối hỏng
  8. }

- Bước 3: thi hành lệnh SQL (hoặc StoreProcedure) sử dụng đối tượng SqlCommand, với bộ quản lý transaction
  1. SqlCommand cmd = new System.Data.SqlClient.SqlCommand();    //tạo đối tượng cmd mới
  2. cmd.CommandType = CommandType.Text;        //loại lệnh: câu lệnh SQL
  3. cmd.CommandText = <câu lệnh SQL cập nhật dữ liệu>;   //gán câu lệnh SQL
  4. cmd.Connection = cnn;      //ấn định kết nối CSDL cho đối tượng cmd
  5.  
  6. SqlTransaction transaction;     //khai báo một transaction
  7. transaction = cnn.BeginTransaction();    //bắt đầu quá trình quản lý transaction
  8. cmd.Transaction = transaction;     //gắn transaction với đối tượng cmd
  9.  
  10. {
  11.     cmd.ExecuteNonQuery();
  12.     transaction.Commit();      //cam kết thực hiện thành công
  13. }
  14. catch(Exception e)    //nếu xảy ra lỗi
  15. {
  16.     //hiển thị thông báo lỗi tại đây
  17.     transaction.Rollback();     //quay lùi
  18. }

No comments:

Post a Comment