begin transaction virement
declare @balance float,@x float;
--设置转账金额
set @x=2000;
--如果转出账号上的金额小于x,则取消转账操作
select @balance=balance from usertable where account='002';
if(@balance<@x)
return;
--否则执行下列操作
--从转出账号上扣除x
update usertable set balance=balance-@x where account='002';
--在转入账号上加上x
update usertable set balance=balance+@x where account='203';
--转账操作结束
go
commit transaction virement;
--提交事务,事务终止
事务的全部回滚
use Test;
go
create table TestTransaction
(
c1 char(3),
c2 char(3)
);
go
begin transaction mytrans
insert into TestTransaction values('aa1','aa2');
insert into TestTransaction values('bb1','bb2');
insert into TestTransaction values('cc1','cc2');
rollback transaction mytrans
insert into TestTransaction values('dd1','dd2');
insert into TestTransaction values('ee1','ee2');
select * from TestTransaction
结果为:
c1
c2
1
dd1
dd2
2
ee1
ee2
由于rollback语句对整个事务进行全部的回滚,使得数据库回到执行这三条插入语句之前的状态。
事务的部分回滚(有savepoint)
use Test;
go
drop table TestTransaction
create table TestTransaction
(
c1 char(3),
c2 char(3)
);
go
begin transaction mytrans --开始事务
insert into TestTransaction values('aa1','aa2');
insert into TestTransaction values('bb1','bb2');
save transaction save1; --设置保存点
insert into TestTransaction values('cc1','cc2');
rollback transaction save1;
insert into TestTransaction values('dd1','dd2');
insert into TestTransaction values('ee1','ee2');
select * from TestTransaction