Transaction Processing
This document details the transaction processing features of the cDataBase class, including transaction start, commit, rollback, etc.
Table of Contents
Transaction Overview
What is a Transaction
A transaction is a set of database operations that either all succeed or all fail. Transactions have the following characteristics (ACID):
- Atomicity - All operations in a transaction either execute completely or not at all
- Consistency - Database maintains consistent state before and after transaction execution
- Isolation - Concurrent transactions are isolated from each other
- Durability - After transaction commit, data is permanently saved
Transaction States
Start Transaction
│
▼
Execute Operation 1
│
▼
Execute Operation 2
│
▼
Execute Operation 3
│
▼
Commit Transaction ──→ Success: All operations take effect
│
└──→ Failure: Auto rollback, all operations revertedTransaction Methods
TransBegin Method
The TransBegin method starts a new transaction.
Syntax
vb
Function TransBegin() As BooleanReturn Value
True- Transaction started successfullyFalse- Transaction start failed (view error viaLastErr)
Example
vb
' Start transaction
If db.TransBegin Then
Debug.Print "Transaction started"
Else
Debug.Print "Transaction start failed: " & db.LastErr
End IfTransCommit Method
The TransCommit method commits a transaction.
Syntax
vb
Function TransCommit() As BooleanFunctionality
- Commit all operations in the transaction
- If commit fails, auto rollback
- Clear transaction flag
Return Value
True- Commit successfulFalse- Commit failed (already auto rolled back)
Example
vb
' Commit transaction
If db.TransCommit Then
Debug.Print "Transaction committed successfully"
Else
Debug.Print "Transaction commit failed, auto rolled back: " & db.LastErr
End IfTransRollback Method
The TransRollback method rolls back a transaction.
Syntax
vb
Function TransRollback() As BooleanFunctionality
- Revert all operations in the transaction
- Clear transaction flag
Return Value
True- Rollback successfulFalse- Rollback failed (view error viaLastErr)
Example
vb
' Rollback transaction
If db.TransRollback Then
Debug.Print "Transaction rolled back"
Else
Debug.Print "Rollback failed: " & db.LastErr
End IfBasic Usage
Example 1: Simple Transaction
vb
' Start transaction
If db.TransBegin Then
' Execute operation 1
If db.Sql("INSERT INTO users (name) VALUES ('John')").Exec Then
' Execute operation 2
If db.Sql("INSERT INTO posts (user_id, title) VALUES (1, 'Title')").Exec Then
' Commit transaction
If db.TransCommit Then
Debug.Print "Transaction committed successfully"
Else
Debug.Print "Commit failed, auto rolled back"
End If
Else
' Operation 2 failed, rollback
db.TransRollback
End If
Else
' Operation 1 failed, rollback
db.TransRollback
End If
End IfExample 2: Using Error Handling
vb
On Error GoTo ErrHandler
' Start transaction
If Not db.TransBegin Then
Debug.Print "Transaction start failed: " & db.LastErr
Exit Sub
End If
' Execute multiple operations
db.Sql("INSERT INTO users (name) VALUES ('John')").Exec
db.Sql("INSERT INTO users (name) VALUES ('Mary')").Exec
db.Sql("UPDATE users SET status = 'active' WHERE name = 'John'").Exec
' Commit transaction
If db.TransCommit Then
Debug.Print "All operations successful"
Else
Debug.Print "Commit failed: " & db.LastErr
End If
Exit Sub
ErrHandler:
' Error occurred, rollback transaction
db.TransRollback
Debug.Print "Error occurred, transaction rolled back: " & Err.DescriptionExample 3: Transfer Operation
vb
' Transfer operation: Transfer 100 from account A to account B
Function TransferMoney(lFromAccount As Long, lToAccount As Long, dAmount As Double) As Boolean
On Error GoTo ErrHandler
' Start transaction
If Not db.TransBegin Then
TransferMoney = False
Exit Function
End If
' Deduct amount from account A
Dim sSql As String
sSql = "UPDATE accounts SET balance = balance - " & dAmount & _
" WHERE id = " & lFromAccount & " AND balance >= " & dAmount
If Not db.Sql(sSql).Exec Then
db.TransRollback
TransferMoney = False
Exit Function
End If
' Check if records were updated
Dim lAffected As Long
If db.Sql("SELECT @@ROWCOUNT").Query Then
If db.Rs.EOF Or db.Rs(0) = 0 Then
db.TransRollback
TransferMoney = False
Exit Function
End If
End If
' Add amount to account B
sSql = "UPDATE accounts SET balance = balance + " & dAmount & _
" WHERE id = " & lToAccount
If Not db.Sql(sSql).Exec Then
db.TransRollback
TransferMoney = False
Exit Function
End If
' Log transfer
sSql = "INSERT INTO transfers (from_account, to_account, amount) VALUES (" & _
lFromAccount & ", " & lToAccount & ", " & dAmount & ")"
If Not db.Sql(sSql).Exec Then
db.TransRollback
TransferMoney = False
Exit Function
End If
' Commit transaction
If db.TransCommit Then
TransferMoney = True
Else
TransferMoney = False
End If
Exit Function
ErrHandler:
db.TransRollback
TransferMoney = False
End FunctionError Handling
Auto Rollback Mechanism
The library provides an auto rollback mechanism:
- Auto rollback on commit failure -
TransCommitautomatically callsTransRollbackwhen failed - Auto rollback on disconnect -
Disconnectautomatically rolls back incomplete transactions
vb
' Auto rollback on commit failure
If db.TransBegin Then
db.Sql("INSERT INTO users (name) VALUES ('John')").Exec
' If commit fails, auto rollback
If Not db.TransCommit Then
Debug.Print "Commit failed, auto rolled back: " & db.LastErr
End If
End IfError Handling Example
vb
Function ExecuteTransaction() As Boolean
On Error GoTo ErrHandler
' Start transaction
If Not db.TransBegin Then
Debug.Print "Transaction start failed: " & db.LastErr
ExecuteTransaction = False
Exit Function
End If
' Execute operation
If Not db.Sql("INSERT INTO users (name) VALUES ('John')").Exec Then
db.TransRollback
Debug.Print "Operation failed: " & db.LastErr
ExecuteTransaction = False
Exit Function
End If
' Commit transaction
If db.TransCommit Then
ExecuteTransaction = True
Else
Debug.Print "Commit failed: " & db.LastErr
ExecuteTransaction = False
End If
Exit Function
ErrHandler:
' Exception occurred, rollback transaction
db.TransRollback
Debug.Print "Exception occurred, rolled back: " & Err.Description
ExecuteTransaction = False
End FunctionNested Transactions
Notes
ADO supports nested transactions, but needs attention:
- Nesting levels - ADO supports multi-level nested transactions
- Commit order - Must commit in reverse order (inner first)
- Rollback impact - Rollback affects all nesting levels
Nested Transaction Example
vb
' Outer transaction
If db.TransBegin Then
db.Sql("INSERT INTO users (name) VALUES ('User1')").Exec
' Inner transaction (nested)
If db.TransBegin Then
db.Sql("INSERT INTO posts (user_id, title) VALUES (1, 'Title1')").Exec
' Commit inner transaction
If db.TransCommit Then
Debug.Print "Inner transaction committed successfully"
End If
End If
' Commit outer transaction
If db.TransCommit Then
Debug.Print "Outer transaction committed successfully"
End If
End IfBest Practices
1. Always Use Transactions for Multiple Related Operations
vb
' Recommended: Use transactions to ensure consistency
db.TransBegin
db.Sql("INSERT INTO users (name) VALUES ('John')").Exec
db.Sql("INSERT INTO posts (user_id, title) VALUES (1, 'Title')").Exec
db.TransCommit
' Not recommended: Without transactions
db.Sql("INSERT INTO users (name) VALUES ('John')").Exec
db.Sql("INSERT INTO posts (user_id, title) VALUES (1, 'Title')").Exec
' If second operation fails, first operation already committed, data inconsistent2. Check Return Value of Each Operation
vb
' Recommended: Check each operation
db.TransBegin
If Not db.Sql("INSERT INTO users (name) VALUES ('John')").Exec Then
db.TransRollback
Exit Sub
End If
If Not db.Sql("INSERT INTO posts (user_id, title) VALUES (1, 'Title')").Exec Then
db.TransRollback
Exit Sub
End If
db.TransCommit3. Use Error Handling
vb
' Recommended: Use error handling
On Error GoTo ErrHandler
db.TransBegin
db.Sql("INSERT INTO users (name) VALUES ('John')").Exec
db.Sql("INSERT INTO posts (user_id, title) VALUES (1, 'Title')").Exec
db.TransCommit
Exit Sub
ErrHandler:
db.TransRollback
Debug.Print "Error: " & Err.Description4. Commit or Rollback Promptly
vb
' Recommended: Commit or rollback immediately after operations
db.TransBegin
' ... execute operations ...
db.TransCommit ' Or db.TransRollback
' Not recommended: Keep transaction open for long time
db.TransBegin
' ... execute operations ...
' Wait for user input (transaction remains open)
' ...
db.TransCommit5. Use Transactions for Batch Operations
vb
' Recommended: Use transactions for batch operations
db.TransBegin
Dim i As Long
For i = 1 To 1000
If Not db.Sql("INSERT INTO users (name) VALUES ('User" & i & "')").Exec Then
db.TransRollback
Exit For
End If
Next
If i > 1000 Then
db.TransCommit
End IfCommon Questions
Q1: Data not saved after transaction commit?
Cause: Database may not support transactions, or connection string configuration issue.
Solution:
- Check if database type supports transactions
- Verify connection string configuration
Q2: How to check transaction status?
vb
' Note: Library internally uses IsTrans flag but does not expose it
' Can check by attempting to commit
If db.TransCommit Then
Debug.Print "Transaction exists and committed successfully"
Else
Debug.Print "No transaction or commit failed"
End IfQ3: Do transactions affect performance?
Answer: Yes, transactions lock resources and affect concurrent performance.
Recommendations:
- Minimize transaction duration
- Only include necessary operations
- Avoid long operations in transactions
Last Updated: 2026-01-21