MS SQL SERVER 存储过程事务的实现方式
目前找到两种实现方式:
1, 使用事务的存储过程使用特殊命名, 如UP_ProductAdd_Tran, 内部只需一对事务语句即可管理所有牵涉到业务的其他过程; 其他未使用此种方式命名的过程, 内部不能使用事务相关语句, 只需输出成功失败. 这种方式的好处是容易理解, 你只需要专心业务上的代码, 意外的时候返回错误, 在最外层直接回滚即可...缺点是你可能会产生很多_Tran命名的存储过程, 不好维护.
UP_TestProcedure_Tran
1
2 CREATE PROCEDURE [dbo].[UP_TestProcedure_Tran]
3 @ResultMessage nvarchar(255) output -- 输出信息
4 -- 其他参数
5
6 AS
7 SET NOCOUNT OFF
8 ---------------------------------------------------------------------------
9 declare @CurrentError int;
10 set @ResultMessage = 'OK';
11
12 -- 事务控制开始
13 begin Tran
14 ---------------------------------------------------------------------------
15 exec @CurrentError = [UP_TestProcedure]
16 @ResultMessage output -- 输出信息
17 -- 其他参数
18 ;
19
20 if(@CurrentError <> 0)
21 begin
22 set @CurrentError = 10;
23 set @ResultMessage = '----------';
24 goto TranLabel;
25 end
26
27 ---------------------------------------------------------------------------
28 -- 事务控制结束(提交或回滚)
29 TranLabel:
30 if(@CurrentError <> 0 and @@TRANCOUNT > 0)
31 begin
32 RollBack Tran;
33 end
34 if(@CurrentError = 0 and @@TRANCOUNT > 0)
35 begin
36 commit Tran;
37 end
38
39 return @CurrentError;
40
41
2, 使用嵌套方式, 实现稍微麻烦, 接受一个事务计数变量, 以维护与调用者的同步, 完成时根据计数决定提交还是回滚, 代码如下:
UP_TestTransaction
1 CREATE PROCEDURE [dbo].[UP_TestTransaction]
2 @LocalTranCount int output, -- 输出信息
3 @ResultMessage nvarchar(255) output -- 输出信息
4 -- 其他字段
5 -- 其他字段
6 AS
7 -- declare @LocalTranCount int;
8 -- set @LocalTranCount = 0;
9 -- 将 @LocalTranCount 定义为输入输出参数
10 -- 将 @LocalTranCount 定义为输入输出参数
11 -- 当该存储过程被其他存储过程调用时
12 -- 传入当前的事务计数
13
14 declare @ErrorCode int;
15 set @ErrorCode = 0;
16
17 begin Transaction
18 set @LocalTranCount = @LocalTranCount + 1;
19
20 begin Transaction
21 set @LocalTranCount = @LocalTranCount + 1;
22 insert into [tbCar] (
23 CarCode,
24 CarHongKongCode,
25 NormalDriver,
26 NormalDriverTel,
27 BelongDepartmentId,
28 BelongDepartment,
29 CreateByUserId,
30 CreateByUser
31 ) values (
32 '------',
33 '5555555555',
34 '6666666666',
35 '77777777',
36 0,
37 'uuuuuuu',
38 0,
39 'bbbbbbb'
40 )
41
42 begin
43 set @ErrorCode = 10;
44 set @ResultMessage = '---------';
45 goto ErrorLabel;
46 end
47
48 begin Transaction
49 set @LocalTranCount = @LocalTranCount + 1;
50 insert into [tbCar] (
51 CarCode,
52 CarHongKongCode,
53 NormalDriver,
54 NormalDriverTel,
55 BelongDepartmentId,
56 BelongDepartment,
57 CreateByUserId,
58 CreateByUser
59 ) values (
60 '--4353---',
61 '5555555555',
62 '6666666666',
63 '77777777',
64 0,
65 'uuuuuuu',
66 0,
67 'bbbbbbb'
68 )
69
70 begin
71 set @ErrorCode = 20;
72 set @ResultMessage = '---------';
73 goto ErrorLabel;
74 end
75 commit Transaction
76 commit Transaction
77
78
79 ErrorLabel:
80 IF(@@TranCount = @LocalTranCount)
81 RollBack Transaction;
82 Else
83 Commit Transaction;
84
85 return @ErrorCode;
参考资料:
http://www.cnblogs.com/montaque/archive/2005/03/12/117410.html 第一页评论
虽然只有几个字, 但是写的时候还是感觉到文字不行..好像说不清楚 ~!@#$%^&*