积极答复者
如何编写sql事务

问题
-
答案
-
Castrandom,
使用事务需要特别注意一个地方:@@ERROR<>0只能判断当前语句的执行结果!
你这里begin transaction后面写了2条语句,如果第一条执行失败,而第二条执行成功,那么返回@@ERROR的结果是0(0表示成功);同样,如果第一条执行成功,而第二条执行失败,那么@@ERROR的结果是1哦。
@@error只能判断当前一条语句执行是否有错,为了判断事务中所有语句是否有错,建议对错误进行累计;
如:SET @errorSum=@errorSum+@@error,最后一步根据@errorSum来判断所有的语句是否成功。
Thanks, Yoyo Yu- 已建议为答案 Jing Jin - MSFT 2011年1月5日 6:21
- 已标记为答案 Tom Li - MSFTModerator 2011年1月6日 8:46
-
--SQL2000: --方法1、 begin TRANSACTION --.........................定義變量 DECLARE @ID INT SET @ID=10 INSERT INTO YK (编号) SELECT 编号 FROM YK where ID=@ID --插入表1 if @@ERROR<>0 GOTO Error update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2 if @@ERROR<>0 GOTO Error commit TRANSACTION RETURN ERROR: rollback TRANSACTION --方法2: SET XACT_ABORT ON ;--指定當 Transact-SQL 陳述式產生執行階段錯誤時,SQL Server 是否自動回復目前的交易。 begin TRANSACTION --.........................定義變量 DECLARE @ID INT SET @ID=10 INSERT INTO YK (编号) SELECT 编号 FROM YK where ID=@ID --插入表1 update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2 COMMIT TRANSACTION --SQL2005以上版本用 BEGIN TRY BEGIN TRAN --.........................定義變量 DECLARE @ID INT SET @ID=10 INSERT INTO YK (编号) SELECT 编号 FROM YK where ID=@ID --插入表1 update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2 COMMIT TRAN END TRY BEGIN CATCH DECLARE @Error NVARCHAR(2000) SET @Error=ERROR_MESSAGE() ROLLBACK TRAN RAISERROR 50001 @Error END CATCH
ROY WU(吳熹 )- 已标记为答案 Tom Li - MSFTModerator 2011年1月6日 8:46
全部回复
-
你好,
正如Stone 所言,你的语句没啥问题~
你说你有2张表要更新,根据你语句,你只更新了GQK 这张表。
更多关于事务的信息,你可以参阅下面的文档:
谢谢,
邱爱华
Ai-hua Qiu[MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
-
Castrandom,
使用事务需要特别注意一个地方:@@ERROR<>0只能判断当前语句的执行结果!
你这里begin transaction后面写了2条语句,如果第一条执行失败,而第二条执行成功,那么返回@@ERROR的结果是0(0表示成功);同样,如果第一条执行成功,而第二条执行失败,那么@@ERROR的结果是1哦。
@@error只能判断当前一条语句执行是否有错,为了判断事务中所有语句是否有错,建议对错误进行累计;
如:SET @errorSum=@errorSum+@@error,最后一步根据@errorSum来判断所有的语句是否成功。
Thanks, Yoyo Yu- 已建议为答案 Jing Jin - MSFT 2011年1月5日 6:21
- 已标记为答案 Tom Li - MSFTModerator 2011年1月6日 8:46
-
--SQL2000: --方法1、 begin TRANSACTION --.........................定義變量 DECLARE @ID INT SET @ID=10 INSERT INTO YK (编号) SELECT 编号 FROM YK where ID=@ID --插入表1 if @@ERROR<>0 GOTO Error update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2 if @@ERROR<>0 GOTO Error commit TRANSACTION RETURN ERROR: rollback TRANSACTION --方法2: SET XACT_ABORT ON ;--指定當 Transact-SQL 陳述式產生執行階段錯誤時,SQL Server 是否自動回復目前的交易。 begin TRANSACTION --.........................定義變量 DECLARE @ID INT SET @ID=10 INSERT INTO YK (编号) SELECT 编号 FROM YK where ID=@ID --插入表1 update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2 COMMIT TRANSACTION --SQL2005以上版本用 BEGIN TRY BEGIN TRAN --.........................定義變量 DECLARE @ID INT SET @ID=10 INSERT INTO YK (编号) SELECT 编号 FROM YK where ID=@ID --插入表1 update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2 COMMIT TRAN END TRY BEGIN CATCH DECLARE @Error NVARCHAR(2000) SET @Error=ERROR_MESSAGE() ROLLBACK TRAN RAISERROR 50001 @Error END CATCH
ROY WU(吳熹 )- 已标记为答案 Tom Li - MSFTModerator 2011年1月6日 8:46