在開發web應用時,無一例外地需要訪問資料庫,以完成對資料的查詢、插入、更新、刪除等操作。受應用邏輯的影響,有時需要將多條資料庫操作指令組成乙個工作單元(事務)。在資料庫中,所謂事務是指一組邏輯操作單元,它使資料從一種狀態變換到另一種狀態。為確保資料庫中資料的一致性,應當用離散的成組的邏輯單元運算元據:當它全部完成時,資料的一致性可以保持;而當單元中的一部分操作失敗時,整個事務會被全部忽略,所有從起始點以後的操作全部退回到開始狀態。
實際上,在預設方式下對資料庫的每一次操作都是隱含的事務處理。本文以乙個典型的使用者註冊程式為例,介紹三種利用asp實現事務處理的方法:基於asp資料庫元件的解決方法、基於資料庫內部的事務處理機制的解決方法和基於mts元件的解決方法。
程式功能
在sql
server資料庫中建立兩個表:user表和userdoc表。其中user表中存放的是註冊使用者的使用者名稱和密碼,userdoc表中存放的是該註冊使用者的個人資料,並且以使用者名為索引。下面是表user和userdoc的定義:
create table user(username varchar(30),userpasswd varchar(30))
create table userdoc(username varchar(30),age int,***
int,phonenumber varchar(20),address varchar(50))
方法一
利用asp內建ado元件中的connection物件可以實現對資料庫操作的事務性處理。connection物件的部分方法如下:
●connection.begintrans方法:啟動乙個事務;
●connection.committrans方法:完成/提交乙個事務;
●connection.rollbacktrans方法:撤消/放棄乙個事務。
<%
'啟動乙個事務操作
conn.begintrans
sqltext="insert into user(username,userpasswd) values('"
sqltext=sqltext & request("usrname") &
"','"&request("usrpasswd")&"') "
conn.execute(sqltext)
if conn.errors.count>0 then
conn.errors.clear
'如果插入資料操作失敗,則事務向前回滾
conn.rollbacktrans
response.redirct registe***il.html
end if
sqltext="insert into userdoc(username,age,***,phonenumber,address) "
sqltext=sqltext & "values('"& request("usrname") & "', " &
request("age")
sqltext=sqltext & ",'" & request("phonenum") & "','"
sqltext=sqltext & request("address") & "') "
'執行事務單元中的第二條插入語句
conn.execute(sqltext)
if conn.errors.count>0 then
conn.errors.clear
'如果操作失敗,則事務向前回滾
conn.rollbacktrans
response.redirct registe***il.html
end if
'如果整個事務操作執行正確,則提交事務
conn.committrans
'轉向註冊成功處理頁面
response.redirct registerok.html
%>
方法二
可以利用資料庫系統內部的事務處理機制,通過在資料庫伺服器中編寫包含事務的儲存過程,完成對資料操作的事務處理。同時,利用ado元件呼叫儲存過程,還可以根據儲存過程的返回**判斷事務處理是否執行成功。
在資料庫系統中,每一條sql語句都是乙個事務。因此可以保證每條語句要麼完成,要麼退回到開始之處。但是如果希望一組sql語句的操作要麼全部完成,要麼全部無效,就需要利用資料庫的事務處理機制來實現。
在資料庫中生成儲存過程的主要**如下:
create proc registeruser
(@usrname varchar(30), @usrpasswd varchar(30),@age int, @phonenum
varchar(20), @address varchar(50) )
as begin
//顯示定義並開始乙個事務
begin tran
insert into user(username,userpasswd) values(@usrname,@usrpasswd)
if @@error<>0
begin
//操作失敗,則事務回滾
rollback tran
//返回儲存過程,並設定返回碼為事務操作失敗
return -1
end
insert into userdoc(username,age,***,phonenumber,address)
values(@usrname,@age,@phonenum,@address)
if @@error<>0
begin
//操作失敗,則事務回滾
rollback tran
return -1
end
//如果操作執行正確,則提交事務
commit tran
return 0
end
在asp指令碼中呼叫資料庫儲存過程的主要**如下:
<%
set comm=server.createobject("adodb.command")
set comm.activeconnection=conn
comm.commandtype=adcmdstoredproc
comm.commandtext="registeruser"
'建立儲存過程返回引數物件
set
retcode=comm.createparameter("retcode",adinteger,adparamreturnvalue)
方法三
利用mts(microsoft transaction
server)元件的事務處理機制實現事務處理時,需要特別注意的是,這種機制下的事務不能跨越多個asp頁,如果乙個事務處理需要來自多個元件的物件,則須將對這些物件的操作組合在乙個asp頁中。
首先需要在頁首新增指令@transaction,將乙個asp頁面宣告為事務性。@transaction指令必須在一頁中的第一行,否則將產生錯誤。當頁面中asp指令碼處理結束時,當前事務即告結束。
<%
@ transaction=required language= vbscript
'事務執行成功觸發事件
sub ontransactioncommit()
response.redirect registerok.html
end sub
'事物執行失敗觸發事件
sub ontransactionabort()
response.redirect registe***il.html
end sub
sqltext="insert into user(username,userpasswd) values('"
sqltext=sqltext & request("usrname") & "','"
&request("usrpasswd")&"') "
conn.execute(sqltext)
if conn.errors.count>0 then
conn.errors.clear
objectcontext.setabort
end if
sqltext="insert into userdoc(username,age,***,phonenumber,address) "
sqltext=sqltext & "values('" & request("usrname")& "', " &
request("age")
sqltext=sqltext & ",』" & request("phonenum") & "','"
sqltext=sqltext & request("address") & "') "
conn.execute(sqltext)
if conn.errors.count>0 then
conn.errors.clear
objectcontext.setabort
end if
objectcontext.setcomplete
%>
方案比較
從靈活的角度考慮,選擇採用asp資料庫元件的方法具有一定的優勢:既可以選用ado資料庫元件完成事務處理,同時還可以根據實際需要,定製自己的資料庫元件(只要滿足asp元件編寫規範即可)。如果從資料庫事務處理的可靠性等角度考慮,則採用資料庫內部的事務處理儲存過程更好。這樣可以直接利用資料庫事務機制完成應用程式的邏輯事務處理,安全可靠,並且減少了web伺服器與資料庫伺服器之間的資料互動。這一點對分布式資料庫系統尤為重要。採用mts元件的事務處理方法的優勢在於:由mts伺服器直接控制和管理元件(在mts中註冊的元件)操作的完成和撤消,具有良好的擴充套件空間和應用前景,可以充分發揮mts的技術優勢,增強網路應用的容錯性能,提高iis
web伺服器的動態效能。
ASP事務處理的實現方法
一 sql server聯機叢書中關於事務的定義事務 事務是作為單個邏輯工作單元執行的一系列操作。乙個邏輯工作單元必須有四個屬性,稱為 acid 原子性 一致性 隔離性和永續性 屬性,只有這樣才能成為乙個事務 原子性事務必須是原子工作單元 對於其資料修改,要麼全都執行,要麼全都不執行。一致性事務在完...
ASP事務處理
asp事務處理。測試資料庫為sql server,伺服器為本機,資料庫名為test,表名為a,兩個欄位id int 主鍵標識,num int set conn server.createobject adodb.connection strconn provider sqloledb.1 persi...
asp事務處理
當大量的對資料庫進行插入,修改,刪除等操作時,如果要實現事務,可以用以下 如 transaction required on error resume next strsql1 insert into a num values 1 strsql2 insert into a num values a...