当前位置: 代码迷 >> Sql Server >> 请这个存储过程的事务是否正确
  详细解决方案

请这个存储过程的事务是否正确

热度:76   发布时间:2016-04-27 17:22:06.0
请高手指点这个存储过程的事务是否正确!
CREATE PROCEDURE MakeMedicineNo

@ShipId varchar(30),
@ProductId varchar(30),
@AreaNo varchar(5),
@Quantity int


 AS

BEGIN TRAN MakeMedicineNo

DECLARE @maxID INT,@maxSerial varchar(6) ,@i int,@CardNo varchar(20),@IceNo varchar(20),@MedicineNo varchar(24),@Six varchar(6)
SET @i=0
SELECT @maxID=MAX(Serial) FROM WinShipNo WHERE [email protected]
IF @maxID IS NULL 
BEGIN
SET @maxID=0
END

CREATE TABLE #(Serial int, SerialNo varchar(30)) 
WHILE @i <@Quantity
BEGIN 

--SELECT @maxSerial=REPLICATE( '0',6-LEN(@maxID)) + cast(@maxID as varchar),@[email protected]+1  
SET @[email protected]+1 
INSERT #(Serial,SerialNo) SELECT @maxID, REPLICATE( '0',6-LEN(@maxID))+CAST(@maxID AS varchar)
SET @i [email protected] +1
END

SET @MedicineNo=REPLICATE( '&',12-LEN(@ProductId))[email protected] 
SET @Six=+'000000' 
SET @[email protected]+'0000000000001' 
SET @[email protected]+'0000000008888' 

INSERT WinShipNo(ShipId,IceNo,ProductId,MedicineNo,Serial,InTime,CardNo,[Sign]) 
SELECT @ShipId,@IceNo,@ProductId,@[email protected],Serial,GETDATE(),@CardNo,0
FROM #


/*
  SELECT @maxID=MAX(FlowNum) FROM WinShipFlowIfUser WHERE ProductId='A' AND IfUse=0
  SELECT @maxSerial=REPLICATE( '0',6-LEN(RTRIM(@maxID))) + cast(@maxID as varchar) 
  SET @[email protected]+1 
  INSERT WinShipFlow (ProductId,FlowNo) SELECT 'A',@maxSerial 
  INSERT WinShipFlowIfUser (ProductId,FlowNum) SELECT 'A',@maxID
  UPDATE WinShipFlowIfUser set IfUse=1 where ProductId='A' and FlowNum=(@maxid-1)
*/

COMMIT TRAN MakeMedicineNo--事务提交

IF (@@error <> 0) -- 事务回滚

BEGIN
ROLLBACK TRANSACTION MakeMedicineNo
RETURN 0
END
RETURN 1

GO


------解决方案--------------------
可能会出问题,2次INSERT,第2次@@ERROR值已经改变了,可以用变量保存下,最后判断2个值,如果都正确,才提交,否则回滚
------解决方案--------------------
你可以在上面出错的地方就回滚事务,然后就退出存储过程。不需要在最后再来判断这个。
  相关解决方案