1 --BeginTrans:开始事务 2 --CommitTrans:提交事务 3 --RollBackTrans:回滚事务 4 --事务具有原子性,要么不执行,要么全执行,一旦成功执行永久保存。下面是个转账的事务应用的例子。 5 If Not Exists (Select * From sysobjects Where name = 'bank') 6 Begin 7 Create Table bank 8 ( 9 bankid int identity(1,1) Primary Key , 10 username varchar(50) not null, 11 rmbnum float not null 12 ) 13 End 14 15 -- add constraint 限制帐户存额不小于0 (没有事务,失败案例) 16 Alter Table bank add constraint CK_bank_rmbnum check(rmbnum>0) 17 18 -- init table bank 19 Insert Into Bank (username,rmbnum) Values ('张三',10000) 20 Insert Into Bank (username,rmbnum) Values ('李四',10000) 21 Insert Into Bank (username,rmbnum) Values ('王五',10000) 22 Insert Into Bank (username,rmbnum) Values ('小儿',10000) 23 24 25 -- 执行转账 将张三的帐户上划20000万到李四的账户上 26 declare @howmuch float 27 set @howmuch = 20000 28 update bank set rmbnum = rmbnum - @howmuch where username = '张三' --由于约束限制,更新失败 29 update bank set rmbnum = rmbnum + @howmuch where username = '李四' 30 -- 以上过程前者失败后者成功。因为张三账户余额不足。 31 32 33 /* 34 事务的格式: 35 Begin TransAction --开始事务传输 36 Commit TransAction --提交事务 37 RollBack TransAction --回滚事务 38 */ 39 40 update bank set rmbnum = 10000 41 42 set nocount on -- 设置不显示影响的行数 43 print('查看转账前帐户余额:') 44 Select * From bank 45 Begin TransAction --事务开始,带事务案例开始 46 declare @errno int 47 declare @num int 48 set @errno=0 49 set @num=100000 50 --将王五的帐户减少@num 51 Update Bank set rmbnum = rmbnum - @num where username = '王五' 52 set @errno = @errno + @@error --加上执行过程中产生的错误编号 --记录错误 53 -- 将小儿的帐户增加@num 54 update bank set rmbnum = rmbnum + @num where username = '小儿' 55 set @errno = @errno + @@error --记录错误 56 57 58 -- 根据是否产生错误决定事务是提交还是撤销 59 If @errno > 0 60 begin 61 print('事务处理失败,回滚事务!') 62 rollback TransAction --回滚事务 63 end 64 Else 65 Begin 66 print('事务处理成功,提交事务!') 67 Commit TransAction --提交事务 68 End 69 70 print('查看转账后庄户余额:') 71 Select * From Bank