
所謂事務(wù)處理,簡(jiǎn)單地說(shuō),就是所有的數(shù)據(jù)庫(kù)操作都可以看做事務(wù)處理。當(dāng)開(kāi)始一個(gè)事務(wù)處理后,就打開(kāi)Web頁(yè)面與數(shù)據(jù)庫(kù)的事務(wù)處理通道,此時(shí)可以從Web頁(yè)面上直接更新數(shù)據(jù)庫(kù)內(nèi)容,但是更新結(jié)果并不馬上真正反映到數(shù)據(jù)庫(kù)中。只有在提交事務(wù)處理結(jié)果后,數(shù)據(jù)庫(kù)內(nèi)容才能被真正更新,否則,所有的操作都無(wú)效。
用法舉例(db1.mdb中有一個(gè)test表,只包含一個(gè)name文本字段):
<%
Dim conn,sqlstr,sqlstr2,sqlstr3
Set conn=server.createobject("ADODB.connection")
Conn.connectionstring="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("db1.mdb")
Conn.open
sqlstr="insert into test(name) values('aaa')" '正確的SQL語(yǔ)句
sqlstr2="insert into test(name2) values('bbb')" '錯(cuò)誤的SQL語(yǔ)句
sqlstr3="insert into test(name) values('ccc')" '正確的SQL語(yǔ)句
Conn.BeginTrans
conn.execute(sqlstr)
conn.execute(sqlstr2)
conn.execute(sqlstr3)
If conn.Errors.Count=0 then
Conn.CommitTrans
Response.write ""
Else
Conn.RollbackTrans
Response.write ""
End if
Conn.close
Set conn=nothing
%>
這樣當(dāng)執(zhí)行到錯(cuò)誤的SQL語(yǔ)句時(shí)程序拋出錯(cuò)誤信息,不再理會(huì)后面第三條SQL語(yǔ)句正確與否,事務(wù)處理機(jī)制生效,整個(gè)提交過(guò)程無(wú)效。實(shí)現(xiàn)運(yùn)用中我們并不希望將錯(cuò)誤信息展示在用戶面前,于是我們加了On error resume next語(yǔ)句,如下:
<%
Dim conn,sqlstr,sqlstr2,sqlstr3
Set conn=server.createobject("ADODB.connection")
Conn.connectionstring="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("db1.mdb")
Conn.open
sqlstr="insert into test(name) values('aaa')"
sqlstr2="insert into test(name2) values('bbb')"
sqlstr3="insert into test(name) values('ccc')"
On error resume next
Conn.BeginTrans
conn.execute(sqlstr)
conn.execute(sqlstr2)
conn.execute(sqlstr3)
If conn.Errors.Count =0 then
Conn.CommitTrans
Response.write ""
Else
Conn.RollbackTrans
Response.write ""
End if
On Error GoTo 0
Conn.close
Set conn=nothing
%>
這樣出現(xiàn)的問(wèn)題是只要最后一條SQL語(yǔ)句是正確的,那么conn.Errors.Count的值就必定為0,這樣的結(jié)果是先前錯(cuò)誤的SQL語(yǔ)句不會(huì)執(zhí)行,正確的SQL語(yǔ)句會(huì)被正確執(zhí)行,整個(gè)事務(wù)處理機(jī)制基本上等于失效,解決的辦法是將conn.Errors.Count改為err.number,代碼如下:
<%
Dim conn,sqlstr,sqlstr2,sqlstr3
Set conn=server.createobject("ADODB.connection")
Conn.connectionstring="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("db1.mdb")
Conn.open
sqlstr="insert into test(name) values('aaa')"
sqlstr2="insert into test(name2) values('bbb')"
sqlstr3="insert into test(name) values('ccc')"
On error resume next
Conn.BeginTrans
conn.execute(sqlstr)
conn.execute(sqlstr2)
conn.execute(sqlstr3)
If err.number = 0 then
Conn.CommitTrans
Response.write ""
Else
Conn.RollbackTrans
Response.write ""
End if
On Error GoTo 0
Conn.close
Set conn=nothing
%>
呢 稱: | |
表 情: | |
內(nèi) 容: |
評(píng)論內(nèi)容:不能超過(guò) 1000 字,需審核,請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)政策法規(guī)。 |
驗(yàn)證碼: | |
您發(fā)布的評(píng)論即表示同意遵守以下條款:
一、不得利用本站危害國(guó)家安全、泄露國(guó)家秘密,不得侵犯國(guó)家、社會(huì)、集體和公民的合法權(quán)益;
二、不得發(fā)布國(guó)家法律、法規(guī)明令禁止的內(nèi)容;互相尊重,對(duì)自己在本站的言論和行為負(fù)責(zé);
三、本站對(duì)您所發(fā)布內(nèi)容擁有處置權(quán)。