注册 登录
编程论坛 SQL Server论坛

[求助]事务回滚保存点的问题

flmls 发布于 2007-03-21 20:24, 3634 次点击

create procedure sinckypro
as
declare @i int
set @i=1
begin transaction tran_sincky
create table sinckytab(
myid int not null,
myname varchar(10),
mtdesc varchar(50))
save tran save_sincky /*设置保存点*/
while @i<=101
begin
insert into sinckytab values(@i,'sincky','come from 51testing')
set @i=@i+1
end
select * from sinckytab
if @@rowcount!=100
begin
print '100行数据生成失败'
rollback tran tran_sincky /*回滚到事务开始, 当设置成rollback tran save_sincky 执行失败*/
end
else
begin
print '100行数据生成成功'
commit tran tran_sincky
end

exec sinckypro

有个问题:
我是设置101次循环,把事务回滚设置成事务开始rollback tran tran_sincky,执行语句,显示“100行数据生成失败”
当我把回滚语句设置成rollback tran save_sincky时候,执行失败
错误提示是:EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。

16 回复
#2
棉花糖ONE2007-03-22 00:23
因为你rollback tran save_sincky之后,begin transaction tran_sincky就没存在对应的rollback或者commit
#3
flmls2007-03-22 00:34

是不是,还需要编写语句
rollback tran save_sincky(对应的rollbaek是不是还要返回到save_sincky吗)
commit tran save_sincky

#4
Kendy1234562007-03-22 09:22
每一个begin tran都有对应commit或者 rollback

begin transaction tran_sincky
。。。
save tran save_sincky /*设置保存点*/
。。。
if @@rowcount!=100
begin
print '100行数据生成失败'
rollback tran save_sincky /*回滚到事务开始, 当设置成rollback tran save_sincky 执行失败*/
end
else
begin
print '100行数据生成成功'
commit tran tran_sincky
end

看明白了? 当失败时 tran_sincky这个事务并没有对应的commit rollback语句可以执行 事务不能结束
#5
flmls2007-03-23 13:40

明白点了,应该对save_sincky有个对应的commit rollback
但不知道加那里
应该怎么改下啊,求解

#6
flmls2007-03-26 21:38
egin transaction tran_sincky
。。。
save tran save_sincky /*设置保存点*/
。。。
if @@rowcount!=100
begin
print '100行数据生成失败'
rollback tran save_sincky /*回滚到事务开始, 当设置成rollback tran save_sincky 执行失败*/
commit tran save_sincky

end
else
begin
print '100行数据生成成功'
commit tran tran_sincky
end

是不是加一句“commit tran save_sincky”,请指教
#7
棉花糖ONE2007-03-26 21:57

你那里都rollback了,后面的是不会执行了啦,加后面没用了

#8
flmls2007-03-26 22:46
还是不是很明白,
当 print '100行数据生成失败'
rollback tran tran_sincky

语句回滚到 保存点tran_sincky后,效果应该是,事务回滚,保存点前面建立表的语句成功执行,而保存点后的语句取消

为什么,总是错误呢
#9
棉花糖ONE2007-03-26 22:48
#10
flmls2007-03-26 22:52
斑竹,是不是不能执行这个效果?
#11
冰封情愁2007-03-27 23:54
参考一下,如果有错,还请高手们指点.


begin transaction tran_sincky
。。。
save tran save_sincky /*设置保存点*/
。。。
if @@rowcount!=100
begin
print '100行数据生成失败'
rollback tran save_sincky /*回滚到事务开始, 当设置成rollback tran save_sincky 执行失败*/
end
else
begin
print '100行数据生成成功'
end
commit tran tran_sincky
#12
flmls2007-03-30 00:14

楼上的我执行过了,好象也不行

我这个应该对了吧
begin tran begin_transaction
...
save tran save_transaction /*设置保存点*/
...
if (...)
begin
commit tran begin_transaction
end
else
begin
rollback tran save_transaction /*回滚到事务保存点*/
commit save_transaction
end

这下对了吧,斑竹.

#13
冰封情愁2007-03-30 12:28
楼上的,对这段语句我有点不明白,
begin
rollback tran save_transaction /*回滚到事务保存点*/
commit save_transaction
end
其中的 commit save_transaction 语句会会被执行的?
如果楼主调试过,而且可以执行的话,麻烦回个话!!!
#14
dai778484002008-06-29 15:55
我明白了  你后面那个IF ELSE 里面的多是一个复合语句 如果错误你回到用SAVE保存的地方  else 后面的语句就不回执行 你只要把那个ELSE 去了 他就会按顺序执行下面的语句 他几不回报错的
#15
dai778484002008-06-29 16:16
我明白了  你后面那个IF ELSE 里面的多是一个复合语句 如果错误你回到用SAVE保存的地方  else 后面的语句就不回执行 你只要把那个ELSE 去了 他就会按顺序执行下面的语句 他几不回报错的

不要意思
上面的话还是有的点错误,你只要把那个COMMIT TRAN写到ELSE 外就OK了  我调试了 可以
#16
xrbbs2008-09-01 15:50
create procedure sinckypro
as
declare @i int,@j int
set @i=1
set @j=0
begin transaction tran_sincky
create table sinckytab(
myid int not null,
myname varchar(10),
mtdesc varchar(50))
save tran save_sincky /*设置保存点*/
while @i<=101
begin
insert into sinckytab values(@i,'sincky','come from 51testing')
set @i=@i+1
set @j=@j+@@rowcount
print @@rowcount
end
select * from sinckytab
if @j!=101
begin
print @j
print '100行数据生成失败'
rollback tran save_sincky /*回滚到事务开始, 当设置成rollback tran save_sincky 执行失败*/
end
else
begin
print '100行数据生成成功'
commit tran tran_sincky
end

exec sinckypro

上面是我帮你改的,可以运行了
@@rowcount返回受上一语句影响的行数 每一次都返回1不会返回所有影响的行数
#17
bb38522008-09-02 13:57
rollback后面加
commit tran save_sincky就可以了
1