当前位置:Gxlcms >
数据库问题 >
SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
时间:2021-07-01 10:21:17
帮助过:7人阅读
set @trancount = @@trancount;
if (@trancount=0) /*判断事务记数,根据情况确定使用保存点或者新建一个事务*/
begin tran current_tran
else
save tran current_tran
[sql] view plain
copy
- declare @trancount int
- set @trancount = @@trancount;
-
- if (@trancount=0) /*判断事务记数,根据情况确定使用保存点或者新建一个事务*/
- begin tran current_tran
- else
- save tran current_tran
.......
....做事去了
.......
[sql] view plaincopy
- if @error_code != 0 or @logErrorCode != 1
- begin
- rollback tran current_tran
- set @error_code = -1;
- end
- else
- begin
- commit tran current_tran
- set @error_code = 1;
- end
[sql] view plain
copy
- if @error_code != 0 or @logErrorCode != 1
- begin
- rollback tran current_tran
- set @error_code = -1;
- end
- else
- begin
- commit tran current_tran
- set @error_code = 1;
- end
有没有问题?(current_tran是保存点哈,不明白的,后面有比较详细的介绍)
我用了好久了(在一个项目里面),可是突然有一天,也就是今天,它出事了。原因嘛,虽然写的是嵌套的,之前都没有嵌套调到过。
我在外围开了一个事务,再来调这个存储过程,当它 commit tran current_tran 时(rollback tran current_tran是不会有事的),会出什么错误?如果你不能很明确的告诉我,说明你还没有理解得深刻。做个选择吧?
1."...BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。"
2."...BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。
答案:【2】。
线索分析:我是在外部开了一个事务的,所以在未进入该存储过程以前@@trancount的值应该为1;进入时,save tran current_tran, @@trancount值没有变;完事的,执行commit tran current_tran,@@trancount的值应该为0;--所以,进入前,出来后,@@trancount值发生了改变,SqlServer不干了(原因,自己去想吧:拆散了begin tran 配对)。
怎么解决:
1.进入子事务前先记录@@trancount,我们用变量@trancount来记录。
2. 提交子事务前,先判断之前的@trancount是否为0;为0表示"该事务"前没有事务调用,可以直接提交事务;不为0,表明进入该事务前已经有一个事务,该事务是子事务,不能提交。
[sql] view plaincopy
-
-
- if(@trancount = 0)
- begin
- commit tran current_tran
- end
- set @error_code = 1;
[sql] view plain
copy
-
-
- if(@trancount = 0)
- begin
- commit tran current_tran
- end
- set @error_code = 1;
SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
标签:blank llb article 分析 current exce 代码 word 允许