首页 新闻 赞助 找找看

sql事务回滚的一些问题

0
悬赏园豆:10 [已解决问题] 解决于 2013-10-18 22:13

sql在插入多条数据时违反主键规约,执行回滚后希望返回0,(成功返回1),但是外部仍然会捕获到sql抛出的异常,无法获取到返回的0,求大神指点,如何获取0?

so...的主页 so... | 初学一级 | 园豆:59
提问于:2013-10-16 20:09
< >
分享
最佳答案
0
--用全局变量@@error来判断事务在执行过程是否发生错误
begin tran
declare @error int =0 --声明一个局部变量 接收全局@@error
set @error=@error+@@ERROR
update  TblScore set tEnglish=59 where tScoreId=12
set @error=@error+@@ERROR
if(@error>0)
begin
rollback tran;
print 'update failed'
end
else
begin
commit tran;
print 'success'
end
收获园豆:5
秋壶冰月 | 大侠五级 |园豆:5903 | 2013-10-17 00:01

现在问题是,事物执行回滚了,也会返回0,但是,同时抛出异常,导致程序中捕获到异常报错。

so... | 园豆:59 (初学一级) | 2013-10-17 09:06
begin try
BEGIN tran tran_2013
    if @type=1
    begin
    if @CD1<>0
        begin
        insert语句
        end
    if @CD2<>0
        begin
        insert语句
        end
    if @CD3<>0
        begin
        insert语句
        end
    if @CD4<>0
        begin
        insert语句
        end
    end
    else if @type=2
    begin
        update 语句
    end
    commit tran tran_2013 --执行这个事务的操作
    return 1
end try
begin catch

    
    rollback tran tran_2013 --开始执行事务的回滚,恢复的转账开始之前状态
    return 0

end catch

这个有问题吗

so... | 园豆:59 (初学一级) | 2013-10-17 09:46

@so...: 事务是一系列的操作语句,看成一个整体,如果有一个执行出问题,就回滚的,你这样写,怎么感觉有点怪!根据事务的原子性,要嘛全部执行,要嘛全部都不执行!

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-10-17 12:11

@冰壶秋月: 事务是执行了的,我测试过了,但是会抛出异常

so... | 园豆:59 (初学一级) | 2013-10-17 20:14
其他回答(2)
0

这样的语句,不能直接return吧。把return改为select就行了。然后对结果进行判断。

幻天芒 | 园豆:37175 (高人七级) | 2013-10-16 23:48

试过,没用

支持(0) 反对(0) so... | 园豆:59 (初学一级) | 2013-10-17 09:04

@so...:没用?我可是亲测有用的哦。 

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2013-10-17 11:04

@幻天芒: 现在问题是,事物执行回滚了,也会返回0,但是,同时抛出异常,导致程序中捕获到异常报错。

支持(0) 反对(0) so... | 园豆:59 (初学一级) | 2013-10-17 20:15

@so...: 直接在c#中用事务呢!

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2013-10-17 20:45
0

sql server2012 支持 try and catch 了

gunsmoke | 园豆:3592 (老鸟四级) | 2013-10-17 12:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册