利用ASP實現事務處理的方法

2021-04-09 03:08:57 字數 4864 閱讀 8918

在開發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...