sql-server – 事务是否需要try catch?
发布时间:2020-12-12 07:08:38 所属栏目:MsSql教程 来源:网络整理
导读:我是一名c#开发人员,学习更多TSQL.我写了一个这样的脚本: begin transaction--Insert into several tablesend transaction 但我被告知这不是一个好主意,并使用这样的东西: BEGIN TRANSACTION;BEGIN TRY -- Generate a constraint violation error. DELETE F
我是一名c#开发人员,学习更多TSQL.我写了一个这样的脚本:
begin transaction --Insert into several tables end transaction 但我被告知这不是一个好主意,并使用这样的东西: BEGIN TRANSACTION; BEGIN TRY -- Generate a constraint violation error. DELETE FROM Production.Product WHERE ProductID = 980; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_SEVERITY() AS ErrorSeverity,ERROR_STATE() AS ErrorState,ERROR_PROCEDURE() AS ErrorProcedure,ERROR_LINE() AS ErrorLine,ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; END CATCH; IF @@TRANCOUNT > 0 COMMIT TRANSACTION; GO 我不明白为什么第二个例子更正确.第一个不会以同样的方式工作吗?似乎第一个要么更新所有表,要么根本不更新?我不明白为什么在提交之前检查@@ TRANCOUNT是必要的. 解决方法只有在try块内部并且在实际语句之前才打开一个事务,并且直接提交它,不要等待你的控制转到批处理结束以提交事务.一旦你进入Try Block并且你已经打开了一个事务,如果出现问题控件将跳转到CATCH块,只需在那里回滚你的事务并根据需要进行其他错误处理. 在使用@@ ROWCOUNT函数实际回滚事务检查任何打开的事务之前,我添加了一点检查,它在这种情况下确实没有多大意义.在你打开一个事务之前在你的try块中做一些验证检查更有用,比如检查参数值和其他东西,如果任何验证检查失败,在try块中引发错误,那么控制将跳转到catch块甚至没有在那里打开交易,你可以检查任何打开的交易和回滚,如果有任何打开的交易.在你的情况下,你真的不需要检查任何打开的交易,因为你不会进入catch块,除非你的交易中出现问题. BEGIN TRY BEGIN TRANSACTION -- Multiple Inserts INSERT INTO.... INSERT INTO.... INSERT INTO.... COMMIT TRANSACTION PRINT 'Rows inserted successfully...' END TRY BEGIN CATCH IF (@@TRANCOUNT > 0) BEGIN ROLLBACK TRANSACTION PRINT 'Error detected,all changes reversed' END SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage END CATCH (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |