一、SQL Server联机丛书中关于事务的定义 事务 事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 原子性 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 一致性 事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。 隔离性 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。 持久性 事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。 指定和强制事务处理 SQL 程序员要负责启动和结束事务,同时强制保持数据的逻辑一致性。程序员必须定义数据修改的顺序,使数据相对于其组织的业务规则保持一致。然后,程序员将这些修改语句包括到一个事务中,使 Microsoft® SQL Server™ 能够强制该事务的物理完整性。 企业数据库系统(如 SQL Server)有责任提供一种机制,保证每个事务物理的完整性。SQL Server 提供: 锁定设备,使事务相互隔离。 记录设备,保证事务的持久性。即使服务器硬件、操作系统或 SQL Server 自身出现故障,SQL Server 也可以在重新启动时使用事务日志,将所有未完成的事务自动地回滚到系统出现故障的位置。 事务管理特性,强制保持事务的原子性和一致性。事务启动之后,就必须成功完成,否则 SQL Server 将撤消该事务启动之后对数据所作的所有修改。 ©1988-2000 Microsoft Corporation。保留所有权利。
<% 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, 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‘//如果有错误,则事务向前回滚 Response.Write("Fail") Else objConn.CommitTrans ‘//提交一个事务 Response.Write("OK") End If Call DBClose(objConn)‘//释放数据库链接 %>
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 /*操作失败,事务回滚*/ RollBack Transaction /*返回存储过程,并设置返回码为事务操作失败*/ Return -1 End Insert Into dbo.[UserInfo] (UName, Age, Sex, TelPhone, Address) Values (@UName, @Age, @Sex, @TelPhone, @Address) If @@Error <> 0 Begin /*操作失败,事务回滚*/ RollBack Transaction Return -1 End /*如果操作执行正确,则提交事务*/ Commit Transaction Return 0 End GO
Call DBConnection(objConn)‘//链接数据库 Set MyComm = Server.CreateObject("ADODB.Command") MyComm.ActiveConnection = objConn ‘objConn是数据库连接对象 MyComm.CommandText = "RegisterUser" ‘指定存储过程名 MyComm.CommandType = 4 ‘表明这是一个存储过程 MyComm.Prepared = True ‘要求将SQL命令先行编译 ‘声明存储过程返回值 MyComm.Parameters.Append MyComm.CreateParameter("RetCode",2,4) ‘//创建存储过程输入参数对象 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")) ‘//根据返回值判断注册是否成功 If RetValue < 0 Then Response.Write("Fail") Else Response.Write("OK") End If Set MyComm = Nothing Call DBClose(objConn)‘//释放数据库链接
<%@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, 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)‘//释放数据库链接 %>
|
|