事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。
存储过程是使用事务既可以方便数据库操作,也可以保持数据的完整性。
以机房收费系统中学生注册为例:
--学生注册存储过程 [PROC_Register]
Create procedure [dbo].[PROC_Register]
@cardNo varchar(20),@cardType varchar(20),@studentNo varchar(20),@studentName varchar(20),@sex varchar(20),@department varchar(20),@grade varchar(20),@studentClass varchar(20),
@cash numeric(10, 1),@explain varchar(20),@userID varchar(20),@status varchar(20),@isCheck varchar(20),@registerDate varchar(20),@registerTime varchar(20),
@addMoney varchar(20),@rechargeDate varchar(20),@rechargeTime varchar(20)
As
Begin
--事务
SET NOCOUNT ON;
SET XACT_ABORT ON;
begin Tran --开始一个事务
--添加卡表
Insert into T_Card(cardNo,studentNo,cardType,cash,explain,userID,status,ischeck,registerDate,registerTime) values(@cardNo,@studentNo,@cardType,@cash,@explain,@userID,@status,@isCheck,@registerDate,@registerTime)
--添加学生表
Insert into T_Student(cardNo,studentNo,studentName,sex,department,grade,studentClass) values(@cardNo,@studentNo,@studentName,@sex,@department,@grade,@studentClass)
--添加充值表
Insert into T_Recharge(cardNo,addMoney,rechargeDate,rechargeTime,userID,isCheck) values(@cardNo,@addMoney,@rechargeDate,@rechargeTime,@userID,@isCheck)
If @@Error = 0 --如果数据操作无错
commit Tran --提交事务
else
rollback Tran --回滚事务
END
--说明:
--1 、使用存储过程执行事物,需要开启XACT_ABORT参数(默认值为Off),将该参数设置为On,表示当执行事务时,如果出错,会将transcation设置为uncommittable状态,那么在语句块批处理结束后将回滚所有操作;如果该参数设置为Off,表示当执行事务时,如果出错,出错的语句将不会执行,其他正确的操作继续执行。
--2、当SET NOCOUNT 为 ON 时,不返回计数(计数表示受 Transact-SQL 语句影响的行数,例如在Sql server查询分析器中执行一个delete操作后,下方窗口会提示 Rows Affected)。当 SET NOCOUNT 为 OFF 时,返回计数,我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上 SET NOCOUNT OFF这样的话,以达到优化存储过程的目的。
存储过程和事务以前学习数据库的时候就知道,但也只是停留在概念上面,感觉好难不知道有什么用,而真到实践过程中才发现其实很简单,用处非常大。通过之前了解的和实践相结合,使知识学得更快更透彻。