Sql server数据库设计 5
第五章(事物处理)
事物的概念
事物是一种机制,每个事物是一个独立的工作单元,包含了一组数据库操作命令,是一个不可分割的工作单元
事物的特性
BEGIN TRANSACTION 开始事务(指定事务从此处开始,后续的T-SQL语句都是一个整体)
/*--定义变量,用于累计事务执行过程中的错误--*/
DECLARE @errorSum INT
SET @errorSum=0 --初始化为0,即无错误
/*--转账:保利的账户少2000000元,莱钢的账户多2000000元*/
UPDATE AccountInfo SET currentMoney=currentMoney-2000000
WHERE accountName=‘保利集团'
SET @errorSum=@errorSum+@@error 累计是否有错误
UPDATE AccountInfo SET currentMoney=currentMoney+2000000
WHERE accountName=‘莱钢建设'
SET @errorSum=@errorSum+@@error --累计是否有错误
IF @errorSum<>0 --如果有错误
BEGIN 根据是否有错误,确定事务是提交还是撤销
print '交易失败,回滚事务'
ROLLBACK TRANSACTION 如果有错,则回滚操作,事务结束
END
ELSE
BEGIN
print '交易成功,提交事务,写入硬盘,永久的保存'
COMMIT TRANSACTION 如果成功,则提交操作,事务结束
END
GO
print '查看转账事务后的余额'
SELECT * FROM bank
GO
创建事物的原则
在存储过程中使用事物
eg:
create proc proc_transfer
--包含个输入参数
@intoAccountName char(10), --转入帐户
@outAccountName char(10), ---转出账户
@money money --转账金额
as
---判断转入账户是否存在
if not exists(select 1 from AccountInfo where accountName=@intoAccountName)
begin
print'转入账户不存在'
return
end
if not exists(select 1 from AccountInfo where accountName=@outAccountName)
begin
print'转出账户不存在'
return
end
declare @errorSum int
set @errorSum =0
begin transaction
UPDATE AccountInfo SET currentMoney=currentMoney-@money
WHERE accountName=@outAccountName
SET @errorSum=@errorSum+@@error
UPDATE AccountInfo SET currentMoney=currentMoney+@money
WHERE accountName=@intoAccountName
SET @errorSum=@errorSum+@@error --累计是否有错误
IF @errorSum<>0 --如果有错误
BEGIN
print '交易失败,回滚事务'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
print '交易成功,提交事务,写入硬盘,永久的保存'
COMMIT TRANSACTION
END
GO
使用事物的注意事项