存储过程中使用事务是很重要的,使用事务可以保持数据的关联完整性.事务处理生活中无处不在。例如取款机,如果我们在取钱的时候停电了,或者是其他的意外,这就需要事务处理,如果不加事务处理,可能我们的银行卡里的钱被扣掉了,而没有取出来,就悲剧了。
一、语法:
Create Procedure MyProcedure
( @Param1 nvarchar( 10),
@param2 nvarchar( 10)
)
AS
Begin
Set NOCOUNT ON;
Set XACT_ABORT ON;
Begin Tran
Delete from table1 where name=’abc’;
Insert into table2 values(value1,value2,value3);
Commit Tran
End
使用存储过程执行事务,需要开启XACT_ABORT参数为on,此时如果SQL语句产生运行时错误,整个事务将终止并回滚;为OFF时,只回滚产生错误的SQL语句,而事务将继续进行处理。
举例:机房收费系统中的充值
-- =============================================
-- Author: 刘腾腾
-- Create date: 2013/3/10
-- 充值
-- =============================================
ALTER PROCEDURE [dbo].[PROC_RechargeBLL]
@cardNo varchar(10),@reCharge numeric(18,1),@handlers varchar(10),@isCheck varchar(10),@rechargeDate varchar(10),@rechargeTime varchar(10),@cardCash numeric(18,1)
AS
BEGIN
Set NOCOUNT ON;
Set XACT_ABORT ON;
begin tran ok --开始一个事务OK
--充值表中写信息
insert into T_Recharge(cardNo,reCharge ,handlers,isCheck ,rechargeDate ,rechargeTime )values(@cardNo,@reCharge ,@handlers,@isCheck,@rechargeDate,@rechargeTime)
save tran bcd --保存一个事务点命名为bcd
--更新卡中余额
update T_Card set cardCash =@cardCash+@reCharge where cardNo=@cardNo
if @@error <>0 --判断修改数据有没有出错
begin --如果出错
rollback tran bcd -- 回滚事务到bcd 的还原点
commit tran ok --提交事务
end
else --没有出错
commit tran ok --提交事务
END
在事务中设置了一个保存点,如果事务回滚到保存点的位置,必须继续完成事务,否则将事务回滚到起始点完成取消事务操作。二、事务特点:
1、原子性。事务是一个单元的工作,要么全做,要么全部做;
2、一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
3、隔离性。一个事物的执行不能被其他事务干扰。
4、持续性/永久性。一个事物一旦提交,它对数据的改变就应该是永久性的。
三、事务的处理模型:
1、隐式事务是指每一条数据操作语句都自动地成为一个事务,每个事务都有显示的开始和结束标记。
2、显式事务是指有显式的开始和结束标记的事务,事务的开始是隐式的,结束有明确标记。
3、自动事务是系统自动默认的,开始和结束不用标记。
PS:一开始在写存储过程的时候没有加事务处理,但是在后面的调试程序的过程中出现了SQL语句错误的问题,还有查不到内容的时候,于是加上了事务的处理。事务处理无处不在。