• [Demo] Hướng dẫn sử dụng BeginTrans (DAO)
  • [Demo] Hướng dẫn sử dụng BeginTrans (DAO)

    maidinhdan > 09-03-20, 10:48 PM

    Tiếp nối 02 thủ thuật:
    1. Thủ Thuật [Demo] Hướng dẫn sử dụng UpdateBatch(ADO)
    2. [Thủ Thuật] [Demo] Hướng dẫn sử dụng BeginTrans (ADO)
    Và phần cuối của bộ phim : [Demo] Hướng dẫn sử dụng BeginTrans (DAO)

    * Nhắc lại bài củ hay quên
    Transaction là gì ? ừ thì cứ hiểu nó là một giao dịch cho gọn cả nhà. và DAO cũng như ADO có 03 loại transaction như sau:
    + BeginTrans: Bắt đầu giao dịch  -->Bắt đầu một transaction mới
    + CommitTrans:    'Đồng ý giao dịch --> Lưu các thay đổi và kết thúc transaction hiện hành
    + Rollback (ADO là RollbackTrans -- Tự nhiên có thê chữ Trans) : 'Hủy giao dịch --> Quên tất cả những gì mới làm hồi nảy

    Lại Cứ tưởng tượng thế này: Ta ra cây ATM rút tiền.
    1---> BeginTrans: Chạy xe đạp gần 30Km ra cây ATM, bắt đầu nhét thẻ và bấm kiểm tra tài khoản còn một đống tiền, nhấn rút 1 tỷ.....
    2---> Cây ATM ngạc nhiên hỏi : --> Quý Ông Anh đồng ý rút thật chứ? --> (Phát sinh sự kiện: CommitTrans hoặc Rollback )
    3=> Nếu nhấn Yes : Tiền nhảy ra và hệ thống báo --> bạn đã mất 1 tỷ trong cơ sở dữ liệu của ngân hàng: ==>CommitTrans
    => Nếu nhấn No: như chưa có chuyện gì xảy ra.....những gì bạn đến cây ATM và thao tác hồi nảy giường như là một giấc mơ. haha =>Rollback

    Thôi thôi: code cho lẹ rồi nghỉ
    1. Hàm thêm mới sử dụng DAO dùng Transaction( BeginTrans, CommitTrans, Rollback ):
    Hàm này có thể phát biểu như sau: Code chỉ dùng Database hiện hành muốn dùng Database khác thì tim hiểu nhé...thấm rồi...
    Mã PHP:
    HamThemDAOBeginTran 

    * Hàm chi tiết sau: giải thích đên từng cetimét trờ

    Mã PHP:
    '---------------------------------------------------------------------------------------
    Ten thu tuc/Procedure HamThemDAOBeginTran
    ' Tac gia/ Author    : maidinhdan@gmail.com
    Ngay tao/Date      09/03/2020
    ' Cu phap/ Purpose  : HamThemDAOBeginTran
    Mo ta:
    '---------------------------------------------------------------------------------------
    '
    Function HamThemDAOBeginTran()

    Dim WsCurrent As DAO.Workspace
    Dim db 
    As DAO.Database
    Dim rs 
    As DAO.Recordset

    On Error 
    GoTo Loi

      Set WsCurrent 
    DBEngine.Workspaces(0)  'Tao mot phien lam viec voi Database hien hanh
      Set db = CurrentDb
      Set rs = db.OpenRecordset("tblTest") '
    Mo table tblTest

      WsCurrent
    .BeginTrans '=> Bat dau giao dich
        '
    Bat dau vong lap tu dau den cuoi cung
        
    ' Duyet de them moi vao table tblTest 5000 mau tin cot <=> rs.Fields(1) ; Cot [A] la AutoNumber
        Dim i As Integer    '
    Tao bien dem
        
    For 1 To 5000
            rs
    .AddNew  'Ra lenh them
            rs.Fields(1) = "Test them dong thu: " & i    '
    Them vao cot tuc la cot thu 2 voi noi dung tu 1 den 5000 cu the lap lai
            rs
    .Update
        Next i

        
    ' Xac nhan luu khong? ==> xac nhan chap nhan giao dich hay khong?
        If MsgBox("Ban co muon Luu cac thay cap nhat tren khong?", vbYesNo) = vbYes Then
            WsCurrent.CommitTrans    '
    Dong y giao dichLuu cac thay doi va ket thuc transaction hien hanh
        
    Else
            WsCurrent.Rollback  'Huy giao dich: Huy bo cac thay doi cua transaction va ket thuc no
        End If

    ThoatLoi:
        ' 
    dong rscnn va giai phong bo nho
        rs
    .Close
        db
    .Close
    '  WsCurrent.Close    'lam viec voi Database hien hanh khong can dung cai nay.
        
        Set rs 
    Nothing
        Set WsCurrent 
    Nothing
        
    Exit Function
            
    Loi
    :
            'Neu loi phat sinh trong qua trinh cap nhat se chay cac doan lenh duoi day
            WsCurrent.Rollback  ' 
    Huy giao dich
            Resume ThoatLoi
    End 
    Function 


    2. Hàm sửa dụng DAO dùng Transaction( BeginTrans, CommitTrans, Rollback):
    Mã PHP:
    '---------------------------------------------------------------------------------------
    Ten thu tuc/Procedure HamSuaDAOBeginTran
    ' Tac gia/ Author    : maidinhdan@gmail.com
    Ngay tao/Date      09/03/2020
    ' Cu phap/ Purpose  : HamSuaDAOBeginTran
    Mo ta:
    '---------------------------------------------------------------------------------------
    Nho dang ky thu vien DAO nheMicrosoft DAO 3.6 Object Library

    Function HamSuaDAOBeginTran()

    Dim WsCurrent As DAO.Workspace
    Dim db 
    As DAO.Database
    Dim rs 
    As DAO.Recordset

    On Error 
    GoTo Loi

      Set WsCurrent 
    DBEngine.Workspaces(0)  'Tao mot phien lam viec voi Database hien hanh
      Set db = CurrentDb
      Set rs = db.OpenRecordset("tblTest") '
    Mo table tblTest

        
    If rs.EOF Then GoTo ThoatLoi      'Neu khong co du lieu thi thoat
        rs.MoveFirst  ' 
    Di chuyen den mau tin dau tien
        
      WsCurrent
    .BeginTrans '=> Bat dau giao dich
      Do Until rs.EOF
            rs.Edit    '
    rs.AddNew
            rs
    .Fields(1) = "Sua lai thanh: DAO_BeginTran"
            rs.Update
        rs
    .MoveNext
      Loop

        
    ' Xac nhan luu khong? ==> xac nhan chap nhan giao dich hay khong?
        If MsgBox("Ban co muon Luu cac thay cap nhat tren khong?", vbYesNo) = vbYes Then
            WsCurrent.CommitTrans    '
    Dong y giao dichLuu cac thay doi va ket thuc transaction hien hanh
        
    Else
            WsCurrent.Rollback  'Huy giao dich: Huy bo cac thay doi cua transaction va ket thuc no
        End If

    ThoatLoi:
        ' 
    dong rscnn va giai phong bo nho
        rs
    .Close
        db
    .Close
    '  WsCurrent.Close    'lam viec voi Database hien hanh khong can dung cai nay.
        
        Set rs 
    Nothing
        Set WsCurrent 
    Nothing
        
    Exit Function
            
    Loi
    :
            'Neu loi phat sinh trong qua trinh cap nhat se chay cac doan lenh duoi day
            WsCurrent.Rollback  ' 
    Huy giao dich
            Resume ThoatLoi
    End 
    Function 

    Đính kèm Demo Minh họa file mdb không khóa
    Xin hết phim,

    Rất mong sự đóng góp kinh nghiêm chi tiết về 03 cái Demo này của các Anh/Chị trên diễn đàn (maidinhdan)
  • RE: [Demo] Hướng dẫn sử dụng BeginTrans (DAO)

    ongke0711 > 11-03-20, 05:23 PM

    Bạn Dân diễn giải + demo chi tiết, dễ hiểu quá rồi. Tôi chỉ bổ sung thêm một số ý và test thử thôi.
    Trong bài về UpdateBatch của ADO tôi có đề cập về tốc độ thì có nói dùng thư viện DAO đối với Access sẽ nhanh hơn nhiều thì trong cái demo này các bạn cũng thấy tốc độ ghi 5.000 dòng xuống chỉ trong vòng 1s. Quá nhanh. Nhưng nói vậy không phải ý là thư viện ADO dở nhé các bạn. ADO nó được viết bằng C++ nên tốc độ cũng không phải bàn cãi rồi, chỉ là môi trường để dùng như thế nào thôi. ADO cho phép kết nối tới nhiều nguồn dữ liệu cái mà DAO không làm được nhé, còn nhiều cái hay của nó nữa, các bạn tự tìm hiểu thêm. ADO cũng có BeginTrans dùng cho đối tượng Connection.
    Nói về DAO Transactions, nó rất tuyệt rồi, tôi chỉ chia sẻ thêm về cách sử dụng.
    - Transaction chỉ dùng được khi cập nhật dữ liệu bằng câu lệnh SQL (Insert Into,...), hoặc dùng Recordset (AddNew,...). Dùng cho Unbound Form. Nếu là Bound Form thì dữ liệu nó ghi xuống Table luôn rồi, không thể RollBack lại được. Thực chất khi dùng BeginTrans thì Workspace nó sẽ lưu dữ liệu xuống Cache rồi sau đó mới lưu xuống đĩa cứng, do đó nó có thể hồi lại được. CommitTrans còn có một tham số là "dbForceOSFlush" để buộc Access Engine ghi records xuống ổ cứng ngay lập tức thay vì qua Cache, khi đó dữ liệu sẽ chính xác hơn nếu có User khác truy vấn dữ liệu lúc đó.
          WsCurrent.CommitTrans dbForceOSFlush
    - Dùng cho linked table cũng OK nhé. 
    - Dùng cho Database khác cũng được nếu cùng trong mạng LAN. Lý do: Begin/Commit/Rollback là của Workspace nên khi sử dụng chung một Workspace ("DBEngine.Workspace(0)") cho các Database, nó sẽ tác dụng chung cho tất cả Database trong đó. Nếu Rollback là nó cũng rollback cho các database khác luôn. 
    Ví dụ: mở database khác từ database hiên tại
    Set dbRemote = DBEngine.Workspaces(0).OpenDatabase("\\DELL-PC\ShareFolder\Be1.mdb")






    -