什么是事务:就是一条或多条相关语句,这些语句要么全部成功执行,要么全都不执行。比如,执行到其中的某条语句时,处于某种原因(断电,故障)导致该语句执行失败,这时系统自动撤销事务内之前的语句,使数据库恢复到执行这些语句序列之前的状态。
举个例子:银行转账,将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 语句设置部分回滚的回滚点。