乙個SQL回滾示例

2021-03-31 16:20:05 字數 3735 閱讀 1593

option ***pare database

'本示例演示 access 中的 transaction 語句如何使用

'請將下列** copy 到乙個新建的「模組」中

'按 f5 檢視執行效果

'本示例假定「表1」和「表2」在資料關係上有聯絡,

'在「表1」資料被刪除後,必須在「表2」新增一行記錄,

'如果新增記錄不成功,則「表1」的資料不能被刪除

sub transactiontest1()

'有錯誤**時用rollback transaction回滾保證資料完整性

'以下**新增一些演示資料到 表1 中

addvalues

dim strsql as string

strsql = "delete from 表1"

on error resume next

currentproject.connection.execute "begin transaction"

currentproject.connection.execute strsql

'注意,由於「編號」欄位是「自動編號」型別,不允許人為新增資料,

'因此以下這句sql語句會產生乙個錯誤

strsql = "insert into 表2 (編號) values('2')"

currentproject.connection.execute strsql

if err <> 0 then

debug.print err.number & "->" & err.description

currentproject.connection.execute "rollback transaction"

else

currentproject.connection.execute "***mit transaction"

end if

debug.print "「表1」的記錄數量為:"; dcount("*", "表1") & _

"。注意:「表1」的記錄" & _

iif(dcount("*", "表1") = 0, "已經被刪除", "未被刪除")

end sub

sub transactiontest2()

'沒有錯誤**時用***mit transaction結束任務

'以下**新增一些演示資料到 表1 中

addvalues

dim strsql as string

strsql = "delete from 表1"

on error resume next

currentproject.connection.execute "begin transaction"

currentproject.connection.execute strsql

'與 transactiontest1 比較,本行sql **是正確的。

strsql = "insert into 表2 ([log]) values('已經在" & now() & "成功刪除表1資料')"

currentproject.connection.execute strsql

if err <> 0 then

debug.print err.number & "->" & err.description

currentproject.connection.execute "rollback transaction"

else

currentproject.connection.execute "***mit transaction"

end if

debug.print "「表1」的記錄數量為:"; dcount("*", "表1") & _

"。注意:「表1」的記錄" & _

iif(dcount("*", "表1") = 0, "已經被刪除", "未被刪除")

end sub

sub transactiontest3()

'沒有事務處理機制的保證,資料完整性會被破壞

'以下**新增一些演示資料到 表1 中

addvalues

dim strsql as string

strsql = "delete from 表1"

on error resume next

currentproject.connection.execute strsql

'注意,由於「編號」欄位是「自動編號」型別,不允許人為新增資料,

'因此以下這句sql語句會產生乙個錯誤

strsql = "insert into 表2 (編號) values('2')"

currentproject.connection.execute strsql

if err <> 0 then

debug.print err.number & "->" & err.description

end if

debug.print "「表1」的記錄數量為:"; dcount("*", "表1") & _

"。注意:「表1」的記錄" & _

iif(dcount("*", "表1") = 0, "已經被刪除", "未被刪除")

end sub

'以下兩個過程用於為演示做準備工作,如果你是在乙個新的資料庫中執行本示例,

'請先執行以下兩個過程。

sub createtable()

'以下**在你的資料庫中新建兩個表,準備用於演示

dim strsql as string

strsql = "create table 表1(編號 autoincrement(1,1),start_date text(50)) "

currentproject.connection.execute strsql

strsql = "create table 表2(編號 autoincrement(1,1),[log] text(50)) "

currentproject.connection.execute strsql

end sub

sub addvalues()

'以下**新增一些演示資料到「表1」中

dim strsql as string

strsql = "insert into 表1(start_date) values('aaa')"

currentproject.connection.execute strsql

strsql = "insert into 表1(start_date) values('bbb')"

currentproject.connection.execute strsql

strsql = "insert into 表1(start_date) values('ccc')"

currentproject.connection.execute strsql

strsql = "insert into 表1(start_date) values('ddd')"

currentproject.connection.execute strsql

strsql = "insert into 表1(start_date) values('eee')"

currentproject.connection.execute strsql

strsql = "insert into 表1(start_date) values('fff')"

currentproject.connection.execute strsql

end sub

SQL事務回滾

ben begin transaction 開始乙個事務 commit transaction 提交事務 rollback transaction 回滾事務。其中commit transaction 與rollback transaction 都必須有對應的begin transaction 才能正...

SQL 事物回滾

第一種 declare ierrorcount int set ierrorcount 0 begin tran tran1 insert into t1 id,c1 values 1,1 set ierrorcount ierrorcount error insert into t1 id,c1 ...

SQL 事務回滾

事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性 1.建立表 create table tuser usercode varc...