Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

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

  1. #1
    Ngày gia nhập
    05 2007
    Nơi ở
    HCMC
    Bài viết
    60

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

    Nhân dịp có bạn hỏi về thao tác Transaction trong C#, sonhn xin đóng góp 1 bài viết về vấn đề này, vì biết đâu có anh em sẽ có dịp dùng đến.

    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

    Visual C# Code:
    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

    Visual C# Code:
    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. }
    Đã được chỉnh sửa lần cuối bởi sonhn : 13-06-2007 lúc 10:47 PM.

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà nội
    Bài viết
    77

    bài này hay quá,nhưng mình chưa hiểu lắm,thì khi hệ thống hoạt động lại thì nó thực hiện tiếp là sao,nghĩa là bật CT,ấn nút thực thi thì nó thực hiện tiếp công việc đó hả
    bạn có thể cho 1 ví dụ cụ thể hơn(sử dụng database,có thể up cái mdf lên đây cũng được,nếu kèm theo transaction StoreProcedure thì càng tốt) để thấy tác dụng của nó được ko,cho anh em tham khảo nữa
    thank so much !
    Sống ở trên đời cần có một TẤM LÒNG để lúc đói còn có chỗ mà nhét THỨC ĂN

  3. #3
    Ngày gia nhập
    06 2007
    Bài viết
    1

    VD: có 2 câu lệnh có chức năng chuyển 10 từ Customer 1 qua 2

    Code:
    UPDATE Accounts SET Balance = Balance – 10 WHERE Customer = 1;
    UPDATE Accounts SET Balance = Balance + 10 WHERE Customer = 2;
    Nếu sau khi thực hiện thành công lệnh thứ nhất và khi tới lệnh thứ 2 thì bị lỗi (cúp điện, restart ,...). Và transaction khắc phục được điều đó.
    Tham khảo thêm : ttp://www.codeproject.com/cs/database/transactions.asp
    Coi chừng sai câu lệnh này nha ;
    transaction = cnn.BeginTransaction();
    cnn là OLeDBConnection nha.

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    40

    Trích dẫn Nguyên bản được gửi bởi thanhlv Xem bài viết
    bài này hay quá,nhưng mình chưa hiểu lắm,thì khi hệ thống hoạt động lại thì nó thực hiện tiếp là sao,nghĩa là bật CT,ấn nút thực thi thì nó thực hiện tiếp công việc đó hả
    bạn có thể cho 1 ví dụ cụ thể hơn(sử dụng database,có thể up cái mdf lên đây cũng được,nếu kèm theo transaction StoreProcedure thì càng tốt) để thấy tác dụng của nó được ko,cho anh em tham khảo nữa
    thank so much !
    Bạn hiểu như thế này nhé: Transaction khi thao tác Insert, delete hay update ... gì gì đó thì thực chất nó chưa update database mà mọi kết quả giao tác được chứa trên 1 bộ đệm. Khi nào thấy hoàn tất mọi việc thì nó mới commit. Mà commit xảy ra thì nó mới cập nhật dữ liệu. nếu có vđề gì thì nó Rollback, tức là nó sẽ hủy bỏ và không cập nhật dữ liệu -> dữ liệu không bị gì.

    Trong C# hỗ trợ đối tượng SqlTransaction cho việc quản lý Transaction -> Dùng thôi chứ còn làm gì nữa, hehe

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi hung.tran Xem bài viết
    Bạn hiểu như thế này nhé: Transaction khi thao tác Insert, delete hay update ... gì gì đó thì thực chất nó chưa update database mà mọi kết quả giao tác được chứa trên 1 bộ đệm. Khi nào thấy hoàn tất mọi việc thì nó mới commit. Mà commit xảy ra thì nó mới cập nhật dữ liệu. nếu có vđề gì thì nó Rollback, tức là nó sẽ hủy bỏ và không cập nhật dữ liệu -> dữ liệu không bị gì.

    Trong C# hỗ trợ đối tượng SqlTransaction cho việc quản lý Transaction -> Dùng thôi chứ còn làm gì nữa, hehe
    Các bác sử dụng rất nhiều lệnh đẳng cấp, uyên thâm em đọc thấy cực kì fê... Nhưng hình như các bác quên thằng conn.Close(); , cho em hỏi là nếu như dùng thằng
    finally
    {
    //Gọi tới phương thức hủy của transaction!!!
    trans.Dispose();
    }

    rồi thì có còn cần dùng tới thằng conn.Close() nữa không??????????????

  6. #6
    Ngày gia nhập
    09 2007
    Bài viết
    724

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

    Trích dẫn Nguyên bản được gửi bởi lifeme Xem bài viết
    Các bác sử dụng rất nhiều lệnh đẳng cấp, uyên thâm em đọc thấy cực kì fê... Nhưng hình như các bác quên thằng conn.Close(); , cho em hỏi là nếu như dùng thằng
    finally
    {
    //Gọi tới phương thức hủy của transaction!!!
    trans.Dispose();
    }

    rồi thì có còn cần dùng tới thằng conn.Close() nữa không??????????????
    cái thằng này khi dùng nó bắt buộc phải Disponse.
    câu lệnh Disponse là một câu lệnh ra lệnh "hủy đối tượng" này đi. nên việc kết nối có tự động đóng hay không thì nó không quan tâm. nên ở đây bạn phải thực hiện câu lệnh close();

    ps: mặc dù thằng Farmework nó có chức năng "tự thu gom rác" nhưng hãy cẩn thận khi phó mặc tất cả cho nó. vì có nhiều lúc lỗi xảy ra bạn không thể kiểm soát nổi đâu.

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    294

    Dispose và Close là 2 lệnh có chức năng khác nhau ^^!
    Tuy nhiên với C# thì khi bạn gọi Dispose thì hàm Close sẽ tự động được gọi.
    Tham khảo: _http://msdn.microsoft.com/en-us/library/aa326260(VS.71).aspx

    Còn cái Connection để mặc định là autocommit. Cái này rất là nguy hiểm trong trường hợp bạn có nhiều thao tác trong 1 công việc(vd update 4-5 table trong 1 lần). Do đó nếu muốn chắc chắn nên đặt autocommit = false và dùng commit trans.
    Is the moon rising...

  8. #8
    Ngày gia nhập
    09 2007
    Bài viết
    724

    @darkan: hiih chào bạn. cái mình nói ở đây là dispose cho đối tượng Transaction và close cho đối tượng Connection.

    theo mình được biết thì dispose là một phương thức "hủy thủ công" của một object nào đó(cái này tương đương với một câu lệnh gán một con trỏ bằng NULL của c/c++) nếu sau khi dispose rồi thì không được dùng nó nữa. nếu muốn dùng thì phải new lại.

  9. #9
    Ngày gia nhập
    11 2007
    Bài viết
    294

    Oh,sorry ^^!
    Hôm qua đọc không kỹ cứ nghĩ là cả hàm dispose và close đều của connection ^^!
    2 đối tượng transaction và connection là 2 đối tượng độc lập.
    Dispose transaction thì có liên quan gì đến close connection?
    Bạn mở 1 connection đến server,sau đó khởi tạo 1 transaction trên connection đó. Rồi hủy transaction đó thì đối tượng connection không hề bị ảnh hưởng. Do đó nếu bạn không có ý định dùng connection đó nữa thì phải dùng connection.close.
    Is the moon rising...

  10. #10
    Ngày gia nhập
    12 2011
    Bài viết
    7

    bây giờ mình hay sài EntityFramwork nên ko cần quan tâm tới cú pháp transaction ADO cho lắm, chỉ bắt try catch và SaveChanges ở cuối các giao tác là ổn

Các đề tài tương tự

  1. Xử lý transaction trong mô hình 3 lớp
    Gửi bởi blinkinkin trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 10
    Bài viết cuối: 30-07-2015, 10:26 AM
  2. Cách sử dụng transaction trong asp.net MVC 4?
    Gửi bởi Keither trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 0
    Bài viết cuối: 18-07-2013, 03:08 PM
  3. Check point trong transaction là gì
    Gửi bởi langtu0401 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 0
    Bài viết cuối: 23-01-2013, 11:05 AM
  4. Distributed transaction của .Net trong CSDL phân tán ?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 17-11-2010, 01:38 AM
  5. Transaction simulation trong lập trình C++
    Gửi bởi Emerald214 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 14
    Bài viết cuối: 05-12-2008, 04:37 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn