|
一、SQL Server聯(lián)機(jī)叢書(shū)中關(guān)于事務(wù)的定義 事務(wù) 事務(wù)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。一個(gè)邏輯工作單元必須有四個(gè)屬性,稱為 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個(gè)事務(wù): 原子性 事務(wù)必須是原子工作單元;對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。 一致性 事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如 B 樹(shù)索引或雙向鏈表)都必須是正確的。 隔離性 由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看中間狀態(tài)的數(shù)據(jù)。這稱為可串行性,因?yàn)樗軌蛑匦卵b載起始數(shù)據(jù),并且重播一系列事務(wù),以使數(shù)據(jù)結(jié)束時(shí)的狀態(tài)與原始事務(wù)執(zhí)行的狀態(tài)相同。 持久性 事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)系統(tǒng)故障也將一直保持。 指定和強(qiáng)制事務(wù)處理 SQL 程序員要負(fù)責(zé)啟動(dòng)和結(jié)束事務(wù),同時(shí)強(qiáng)制保持?jǐn)?shù)據(jù)的邏輯一致性。程序員必須定義數(shù)據(jù)修改的順序,使數(shù)據(jù)相對(duì)于其組織的業(yè)務(wù)規(guī)則保持一致。然后,程序員將這些修改語(yǔ)句包括到一個(gè)事務(wù)中,使 Microsoft® SQL Server™ 能夠強(qiáng)制該事務(wù)的物理完整性。 企業(yè)數(shù)據(jù)庫(kù)系統(tǒng)(如 SQL Server)有責(zé)任提供一種機(jī)制,保證每個(gè)事務(wù)物理的完整性。SQL Server 提供: 鎖定設(shè)備,使事務(wù)相互隔離。 記錄設(shè)備,保證事務(wù)的持久性。即使服務(wù)器硬件、操作系統(tǒng)或 SQL Server 自身出現(xiàn)故障,SQL Server 也可以在重新啟動(dòng)時(shí)使用事務(wù)日志,將所有未完成的事務(wù)自動(dòng)地回滾到系統(tǒng)出現(xiàn)故障的位置。 事務(wù)管理特性,強(qiáng)制保持事務(wù)的原子性和一致性。事務(wù)啟動(dòng)之后,就必須成功完成,否則 SQL Server 將撤消該事務(wù)啟動(dòng)之后對(duì)數(shù)據(jù)所作的所有修改。 ©1988-2000 Microsoft Corporation。保留所有權(quán)利。
<% Call DBConnection(objConn)‘//鏈接數(shù)據(jù)庫(kù) On Error Resume Next objConn.BeginTrans ‘//啟動(dòng)一個(gè)事務(wù) ‘//語(yǔ)句一 strSql = "Insert Into [User] (UName, UPasswd) Values (‘"& s_uname &"‘, ‘"& s_upasswd &"‘)" objConn.Execute(strSql) ‘//語(yǔ)句二 strSql = "Insert Into UserInfo (UName, Age, Sex, TelPhone, Address) Values (‘"& s_uname &"‘, "& i_age &", ‘"& s_sex &"‘, ‘"& s_telphone &"‘, ‘"& s_address &"‘)" objConn.Execute(strSql) If objConn.Errors.Count Then Errors.Clear objConn.RollBackTrans‘//如果有錯(cuò)誤,則事務(wù)向前回滾 Response.Write("Fail") Else objConn.CommitTrans ‘//提交一個(gè)事務(wù) Response.Write("OK") End If Call DBClose(objConn)‘//釋放數(shù)據(jù)庫(kù)鏈接 %>
CREATE Procedure dbo.RegisterUser @UName varchar(30), @UPasswd varchar(30), @Age Int, @Sex varchar(6), @TelPhone varchar(20), @Address varchar(50) as Set nocount ON Begin Begin Transaction Insert Into dbo.[User] (UName, UPasswd) Values (@UName, @UPasswd) If @@Error <> 0 Begin /*操作失敗,事務(wù)回滾*/ RollBack Transaction /*返回存儲(chǔ)過(guò)程,并設(shè)置返回碼為事務(wù)操作失敗*/ Return -1 End Insert Into dbo.[UserInfo] (UName, Age, Sex, TelPhone, Address) Values (@UName, @Age, @Sex, @TelPhone, @Address) If @@Error <> 0 Begin /*操作失敗,事務(wù)回滾*/ RollBack Transaction Return -1 End /*如果操作執(zhí)行正確,則提交事務(wù)*/ Commit Transaction Return 0 End GO
Call DBConnection(objConn)‘//鏈接數(shù)據(jù)庫(kù) Set MyComm = Server.CreateObject("ADODB.Command") MyComm.ActiveConnection = objConn ‘objConn是數(shù)據(jù)庫(kù)連接對(duì)象 MyComm.CommandText = "RegisterUser" ‘指定存儲(chǔ)過(guò)程名 MyComm.CommandType = 4 ‘表明這是一個(gè)存儲(chǔ)過(guò)程 MyComm.Prepared = True ‘要求將SQL命令先行編譯 ‘聲明存儲(chǔ)過(guò)程返回值 MyComm.Parameters.Append MyComm.CreateParameter("RetCode",2,4) ‘//創(chuàng)建存儲(chǔ)過(guò)程輸入?yún)?shù)對(duì)象 MyComm.Parameters.append MyComm.CreateParameter("@UName",200,1,30,s_uname) MyComm.Parameters.append MyComm.CreateParameter("@UPasswd",200,1,30,s_upasswd) MyComm.Parameters.append MyComm.CreateParameter("@Age",3,1,4,i_age) MyComm.Parameters.append MyComm.CreateParameter("@Sex",200,1,6,i_sex) MyComm.Parameters.append MyComm.CreateParameter("@TelPhone",200,1,20,s_telphone) MyComm.Parameters.append MyComm.CreateParameter("@Address",200,1,50,s_address) MyComm.Execute RetValue = CInt(MyComm("RetCode")) ‘//根據(jù)返回值判斷注冊(cè)是否成功 If RetValue < 0 Then Response.Write("Fail") Else Response.Write("OK") End If Set MyComm = Nothing Call DBClose(objConn)‘//釋放數(shù)據(jù)庫(kù)鏈接
<%@Transaction = "Required" Language="VBScript"%> <% On Error Resume Next ‘//事務(wù)執(zhí)行成功觸發(fā)事件 Sub OnTransactionCommit() Response.Write("OK") End Sub ‘//事務(wù)執(zhí)行失敗觸發(fā)事件 Sub OnTransactionAbort() Response.Write("Fail") End Sub Call DBConnection(objConn)‘//鏈接數(shù)據(jù)庫(kù) strSql = "Insert Into [User] (UName, UPasswd) Values (‘"& s_uname &"‘, ‘"& s_upasswd &"‘)" objConn.Execute(strSql) strSql = "Insert Into UserInfo (UName, Age, Sex, TelPhone, Address) Values (‘"& s_uname &"‘, "& i_age &", ‘"& s_sex &"‘, ‘"& s_telphone &"‘, ‘"& s_address &"‘)" objConn.Execute(strSql) If Err Then Err.Clear ObjectContext.SetAbort() Else ObjectContext.SetComplete() End If Call DBClose(objConn)‘//釋放數(shù)據(jù)庫(kù)鏈接 %>
|
|
|
來(lái)自: liu_jinbo > 《我的圖書(shū)館》