+ -
当前位置:首页 → 问答吧 → 大家帮忙看一下事务这样写有没有问题

大家帮忙看一下事务这样写有没有问题

时间:2011-12-08

来源:互联网

DECLARE @TranStarted bit
  SET @TranStarted = 0

  IF( @@TRANCOUNT = 0 )
  BEGIN
  BEGIN TRANSACTION
  SET @TranStarted = 1
  END
  ELSE
  SET @TranStarted = 0

update XML_Os
set OState = @OState
where OID = @OID

IF( @@ERROR <> 0 )
BEGIN
GOTO Cleanup
END

exec UpdateSale @OID

IF( @@ERROR <> 0 )
BEGIN
GOTO Cleanup
END

IF( @TranStarted = 1 )
  BEGIN
  SET @TranStarted = 0
  COMMIT TRANSACTION
  END

Cleanup:
  IF( @TranStarted = 1 )
  BEGIN
SET @TranStarted = 0
  ROLLBACK TRANSACTION
  END
END

作者: zhouyisafen   发布时间: 2011-12-08

嵌套的存储过程 UpdateSale

DECLARE @TranStarted bit
  SET @TranStarted = 0

  IF( @@TRANCOUNT = 0 )
  BEGIN
  BEGIN TRANSACTION
  SET @TranStarted = 1
  END
  ELSE
  SET @TranStarted = 0

drop table #Temp_Items

select * into #Temp_Items
from
(
select productid,sum(quantity) as quantity, ROW_NUMBER() over(order by productid asc) as RowNumber
from xml_items
where oid=@OID group by productid
) xml_items

declare @maxNumber int
set @maxNumber=0
select @maxNumber = max(rownumber) from #Temp_Items
declare @counter int
set @counter = 1
while (@counter <= @maxNumber)
begin
declare @quantity int
set @quantity = 0
select @quantity = quantity from #Temp_Items where rownumber = @counter

IF( @@ERROR <> 0 )
BEGIN
GOTO Cleanup
break
END

declare @productid int
set @productid = 0
select @productid = productid from #Temp_Items where rownumber = @counter

IF( @@ERROR <> 0 )
BEGIN
GOTO Cleanup
break
END

update mobilecovers set sale = sale + @quantity where coverid = @productid

set @counter = @counter + 1

IF( @@ERROR <> 0 )
BEGIN
GOTO Cleanup
break
END
end

IF( @TranStarted = 1 )
  BEGIN
  SET @TranStarted = 0
  COMMIT TRANSACTION
  END

Cleanup:
  IF( @TranStarted = 1 )
  BEGIN
SET @TranStarted = 0
  ROLLBACK TRANSACTION
  END

作者: zhouyisafen   发布时间: 2011-12-08

晕,我的1楼呢?

作者: HEROWANG   发布时间: 2011-12-08

BEGIN TRANSACTION
update XML_Os
set OState = @OState
where OID = @OID


exec UpdateSale @OID

IF( @@ERROR <> 0 )
 rollback 
else COMMIT TRANSACTION

作者: HEROWANG   发布时间: 2011-12-08

Cleanup:
这个是什么语法?

作者: fredrickhu   发布时间: 2011-12-08

引用 5 楼 fredrickhu 的回复:
Cleanup:
这个是什么语法?


楼主是用的 goto、,就是对下面的程序做一个标示,是用goto跳转到该标示处

作者: HEROWANG   发布时间: 2011-12-08

外层的存储过程已经用事务了,嵌套的存储过程还有没有必要用事务?呵呵,新手,请指教!

作者: zhouyisafen   发布时间: 2011-12-08

可能会有问题,如果在中间那个存储过程发生错误呢?
可以用那个存储过程反回信息来判断吧。

作者: jinfengyiye   发布时间: 2011-12-08