一、sql server聯機叢書中關於事務的定義事務
事務是作為單個邏輯工作單元執行的一系列操作。乙個邏輯工作單元必須有四個屬性,稱為 acid(原子性、一致性、隔離性和永續性)屬性,只有這樣才能成為乙個事務:
原子性事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。
一致性事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 b 樹索引或雙向鍊錶)都必須是正確的。
隔離性由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。這稱為可序列性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。
永續性事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
指定和強制事務處理
sql 程式設計師要負責啟動和結束事務,同時強制保持資料的邏輯一致性。程式設計師必須定義資料修改的順序,使資料相對於其組織的業務規則保持一致。然後,程式設計師將這些修改語句包括到乙個事務中,使 microsoft® sql server™ 能夠強制該事務的物理完整性。
企業資料庫系統(如 sql server)有責任提供一種機制,保證每個事務物理的完整性。sql server 提供:
鎖定裝置,使事務相互隔離。
記錄裝置,保證事務的永續性。即使伺服器硬體、作業系統或 sql server 自身出現故障,sql server 也可以在重新啟動時使用事務日誌,將所有未完成的事務自動地回滾到系統出現故障的位置。
事務管理特性,強制保持事務的原子性和一致性。事務啟動之後,就必須成功完成,否則 sql server 將撤消該事務啟動之後對資料所作的所有修改。
二、例項
①、利用asp內建ado元件中的connection物件可以實現對資料庫操作的事務性處理。
connection 物件中的事務程序:
<%
call dbconnection(objconn)'//鏈結資料庫
on error resume next
objconn.begintrans '//啟動乙個事務
'//語句一
strsql = "insert into [user] (uname, upasswd) values ('"& s_uname &"', '"& s_upasswd &"')"
objconn.execute(strsql)
'//語句二
strsql = "insert into userinfo (uname, age, ***, telphone, address) values ('"& s_uname &"', "& i_age &", '"& s_*** &"', '"& s_telphone &"', '"& s_address &"')"
objconn.execute(strsql)
if objconn.errors.count then
errors.clear
objconn.rollbacktrans'//如果有錯誤,則事務向前回滾
response.write("fail")
else
objconn.committrans '//提交乙個事務
response.write("ok")
end if
call dbclose(objconn)'//釋放資料庫鏈結
%>
注意: 以上**在語句一遇到錯誤時將不能進行正常的事務處理,語句一將得不到執行。因為用到了on error resume next所以objconn.errors.count只能獲得最後乙個資料庫操作的objconn返回的結果,但是因為語句二是正確的,所以此事務處理就無效了。那麼就需要對出錯處理作出相對應的修改。
將if objconn.errors.count then改為if err then
②、利用資料庫系統自身的事務處理機制,通過在資料庫伺服器中編寫包含事務的儲存過程,完成對資料操作的事務處理。同時,利用ado元件呼叫儲存過程,根據儲存過程的返回**判斷事務處理是否執行成功。
在資料庫系統中,每一條sql語句都是乙個事務。因此可以保證每條語句要麼完成,要麼退回到開始之處。但是如果希望一組sql語句的操作要麼全部完成,要麼全部無效,就需要利用資料庫的事務處理機制來實現。
在資料庫中生成儲存過程的主要**如下:
create procedure dbo.registeruser
@uname varchar(30),
@upasswd varchar(30),
@age int,
@*** varchar(6),
@telphone varchar(20),
@address varchar(50)
asset nocount on
begin
begin transaction
insert into dbo.[user] (uname, upasswd) values (@uname, @upasswd)
if @@error <> 0
begin
/*操作失敗,事務回滾*/
rollback transaction
/*返回儲存過程,並設定返回碼為事務操作失敗*/
return -1
endinsert into dbo.[userinfo] (uname, age, ***, telphone, address) values (@uname, @age, @***, @telphone, @address)
if @@error <> 0
begin
/*操作失敗,事務回滾*/
rollback transaction
return -1
end/*如果操作執行正確,則提交事務*/
commit transaction
return 0
endgo
在asp指令碼中呼叫資料庫儲存過程的主要**如下:
<%@transaction = "required" language="vbscript"%>
<%
on error resume next
'//事務執行成功觸發事件
sub ontransactioncommit()
response.write("ok")
end sub
'//事務執行失敗觸發事件
sub ontransactionabort()
response.write("fail")
end sub
call dbconnection(objconn)'//鏈結資料庫
strsql = "insert into [user] (uname, upasswd) values ('"& s_uname &"', '"& s_upasswd &"')"
objconn.execute(strsql)
strsql = "insert into userinfo (uname, age, ***, telphone, address) values ('"& s_uname &"', "& i_age &", '"& s_*** &"', '"& s_telphone &"', '"& s_address &"')"
objconn.execute(strsql)
if err then
err.clear
objectcontext.setabort()
else
objectcontext.setcomplete()
end if
call dbclose(objconn)'//釋放資料庫鏈結
%>
方案比較 :
從靈活的角度考慮,選擇採用asp資料庫元件的方法具有一定的優勢:既可以選用ado資料庫元件完成事務處理,同時還可以根據實際需要,定製自己的資料庫元件(只要滿足asp元件編寫規範即可)。
如果從資料庫事務處理的可靠性等角度考慮,則採用資料庫內部的事務處理儲存過程更好。這樣可以直接利用資料庫事務機制完成應用程式的邏輯事務處理,安全可靠,並且減少了web伺服器與資料庫伺服器之間的資料互動。這一點對分布式資料庫系統尤為重要。
採用mts元件的事務處理方法的優勢在於:由mts伺服器直接控制和管理元件(在mts中註冊的元件)操作的完成和撤消,具有良好的擴充套件空間和應用前景,可以充分發揮mts的技術優勢,增強網路應用的容錯性能,提高iis web伺服器的動態效能。
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...
ASP事務處理
asp事務處理。測試資料庫為sql server,伺服器為本機,資料庫名為test,表名為a,兩個欄位id int 主鍵標識,num int set conn server.createobject adodb.connection strconn provider sqloledb.1 persi...