SQL Server的事务控制

什么是事务:就是一条或多条相关语句,这些语句要么全部成功执行,要么全都不执行。比如,执行到其中的某条语句时,处于某种原因(断电,故障)导致该语句执行失败,这时系统自动撤销事务内之前的语句,使数据库恢复到执行这些语句序列之前的状态。

举个例子:银行转账,将A账户上的金额x转到B账户上。①首先读入转账金额存入变量x,②如果A余额<x,取消转账;否则③令A-x, ④B+x,结束操作。

我们考虑一种情况,当③执行完了,突然系统故障了,那么A的钱少了,B的钱却没有增加,这肯定是不允许的。把①-④放入一个事务里,通过事务控制就可以实现要么全部成功执行,要么都不执行。

先举一个事务的例子:

例子用到下面的表

create table UserTable
(
UserId varchar(20) primary key,
account varchar(20) not null unique,
balance float default 0,     --余额
);

事务:

BEGIN TRANSACTION zhuanzhang
DECLARE @balance float , @x float;
--设置转账金额
SET @X=200;
SELECT @balance=balance FROM UserTable WHERE account='count1xxxxxx';
IF(@balance<@x) RETURN;
UPDATE UserTable SET balance=balance-@x WHERE account='count1xxxxxx';
UPDATE UserTable SET balance=balance+@x WHERE account='count2xxxxxx';
GO
COMMIT TRANSACTION zhuanzhang;

从例子中我们可以看出,事务以BEGIN TRANSACTION开始,以COMMIT TRANSACTION 结束。


COMMIT 语句提交事务的处理结果。但是有时候DML语句执行失败并不是由硬件故障等外部因素造成的,也有可能是内部运行错误(如违反约束等),在这种情况下,COMMIT TRANSACTION 语句只回滚产生错误的语句,不回滚整个事务。如果希望当遇到某个语句运行错误时,事务依然能够回滚整个事务,应该设置XACT_ABORT为ON.

SET XACT_ABORT ON


除了用COMMIT TRANSACTION提交事务,还可以用ROLLBACK TRANSACTION回滚事务,即撤销事务的结果。他分为全部回滚和部分回滚。可以用SAVE TRANSACTION savePoint 语句设置部分回滚的回滚点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值