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