-
[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 i = 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 dich: Luu 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 rs, cnn 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 nhe: Microsoft 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 dich: Luu 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 rs, cnn 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")
-