请教一个事务的基础问题
例:
begin transaction
update storage
set Quantity = (Quantity - @insertquantity)
where storageid = @storageid
select @updatestor_error = @@ERROR
update RealStocking
set Quantity = (Quantity - @insertquantity)
where Stockingid = @stockingid
select @updaterestoc_error = @@ERROR
if @updatestor_error = 0 and @updaterestoc_error = 0
begin
commit transaction
end
else
begin
if @updatestor_error <> 0
print 'an error occured during update storage. '
if @updaterestoc_error <> 0
print 'an error occured during update reakstocking. '
rollback transaction
end
由于刚接触事务,有几个问题不大明白,想请教一下.
1. 我看有些文章说.如果一个事务已commit或rollback结束了.后面的语句仍将继续.
那么,上面的例子中.如果是在commit transaction结束的.那后面的else还会继续被判断到.只不过条件不符合没有执行里面的语句,是这样吗?
2. 如果是在commit transaction结束的,那后面ELSE中的rollback transaction又是对应的那个begin transaction呢?是不是commit transaction结束了.SQL SERVER会自动加上一个看不见的begin transaction去对应rollback transaction呢.谢谢
begin transaction
update storage
set Quantity = (Quantity - @insertquantity)
where storageid = @storageid
select @updatestor_error = @@ERROR
update RealStocking
set Quantity = (Quantity - @insertquantity)
where Stockingid = @stockingid
select @updaterestoc_error = @@ERROR
if @updatestor_error = 0 and @updaterestoc_error = 0
begin
commit transaction
end
else
begin
if @updatestor_error <> 0
print 'an error occured during update storage. '
if @updaterestoc_error <> 0
print 'an error occured during update reakstocking. '
rollback transaction
end
由于刚接触事务,有几个问题不大明白,想请教一下.
1. 我看有些文章说.如果一个事务已commit或rollback结束了.后面的语句仍将继续.
那么,上面的例子中.如果是在commit transaction结束的.那后面的else还会继续被判断到.只不过条件不符合没有执行里面的语句,是这样吗?
2. 如果是在commit transaction结束的,那后面ELSE中的rollback transaction又是对应的那个begin transaction呢?是不是commit transaction结束了.SQL SERVER会自动加上一个看不见的begin transaction去对应rollback transaction呢.谢谢
作者: refugeetaotao 发布时间: 2007-01-02
第一个问题和事务没有关系,是if语句的问题
第二个问题是只要是提交了事务或者回滚了事务,就表示事务完成了
第二个问题是只要是提交了事务或者回滚了事务,就表示事务完成了
作者: leo_lesley 发布时间: 2007-01-02
declare @number1 int
declare @number2 int
set @number1 = 1
set @number2 = 2
begin transaction
select @number1
rollback transaction
select @number2
commit transaction
那是不是可以这么理解, 上面的这些语句是错误的.因为先执行了rollback transaction
所以此次事务已经结束了.而后面的commit transaction由于没有对应到新的begin transaction(由于第一个begin transaction已经结束)所以程序上会包错.是这么理解吗?谢谢
declare @number2 int
set @number1 = 1
set @number2 = 2
begin transaction
select @number1
rollback transaction
select @number2
commit transaction
那是不是可以这么理解, 上面的这些语句是错误的.因为先执行了rollback transaction
所以此次事务已经结束了.而后面的commit transaction由于没有对应到新的begin transaction(由于第一个begin transaction已经结束)所以程序上会包错.是这么理解吗?谢谢
作者: refugeetaotao 发布时间: 2007-01-02
你是没有理解if else,我也是初次接触事务,但也理解了
1楼给出是begin tran 和 rollback tran 或者是begin tran 和 commit tran对应组成一对
而楼上的就commit tran 没有对应的begin tran嘛
1楼给出是begin tran 和 rollback tran 或者是begin tran 和 commit tran对应组成一对
而楼上的就commit tran 没有对应的begin tran嘛
作者: bulletCoderHope 发布时间: 2007-01-04
if commit else rollback 正常逻辑啊
作者: mabailin 发布时间: 2011-05-12