日期:2014-05-17  浏览次数:20439 次

SQL Server2000 数据库事务的问题
事务的代码是这样的:
CREATE PROCEDURE udt_MoveMoney
(@FromID int,@ToID int,@Money int)
AS
BEGIN TRANSACTION --开启事务

Update StudentMoney set Money = Money - @Money WHERE ID = @FROMID --从转出帐户中转出指定费用

IF @@error <> 0 --如果发生错误,回滚

BEGIN
ROLLBACK TRANSACTION
RETURN
END

Update StudentMoney set Money = Money + @Money WHERE ID = @ToID --转入帐户中增加指定费用

IF @@error <> 0 --如果发生错误,回滚

BEGIN
ROLLBACK TRANSACTION
RETURN 
END

COMMIT TRANSACTION --如果没有错误,提交
GO


数据库中只有两行记录集,
ID MONEY
1 4000
2 3000

调用此过程的代码是:
execute udt_MoveMoney 1,3,500
执行后变为:
ID MONEY
1 3500
2 3000

不明白是哪的问题,请高手指教!



------解决方案--------------------
执行了
因为ID存在
SQL code

Update StudentMoney set Money = Money - @Money WHERE ID = @FROMID --从转出帐户中转出指定费用

------解决方案--------------------
SQL code

create table StudentMoney
(ID int, MONEY int)

insert into StudentMoney
select 1, 4000 union all
select 2, 3000


CREATE PROCEDURE udt_MoveMoney
(@FromID int,@ToID int,@Money int)
AS
BEGIN TRANSACTION --开启事务

Update StudentMoney set Money = Money - @Money WHERE ID = @FROMID --从转出帐户中转出指定费用

IF @@error <> 0 or @@ROWCOUNT=0 --如果发生错误,回滚

BEGIN
ROLLBACK TRANSACTION
RETURN
END

Update StudentMoney set Money = Money + @Money WHERE ID = @ToID --转入帐户中增加指定费用

IF @@error <> 0 or @@ROWCOUNT=0 --如果发生错误,回滚

BEGIN
ROLLBACK TRANSACTION
RETURN  
END

COMMIT TRANSACTION --如果没有错误,提交
GO


execute udt_MoveMoney 1,3,500

select * from StudentMoney

/*
ID          MONEY
----------- -----------
1           4000
2           3000

(2 row(s) affected)
*/