我正在通过带有odbc连接的php使用sql server 2008数据库。
我正在读取数据文件并将它们记录到数据库中,但由于文件大小/布局不同,我的sql会自动生成。
按此顺序调用sql:
set autocommit to off
execute some sql
execute more sql
execute a SP.
commit
在我的存储过程中,我想使用try catch进行错误处理,如下所示:
BEGIN try
--sql
END try
BEGIN catch
rollback
END catch
我想知道这会只回滚sp并让我的其他sql提交还是会回到autocommit设置为off的地步?
另一种可能的解决方案是从存储过程返回false / true并使用它从php调用回滚。这可能吗?如果是这样,如何使用存储过程返回值?
答案 0 :(得分:1)
AFAIK,只要您将要回滚的所有内容包装到事务中,然后您就知道可以回滚那么远。请注意您的被叫处理委托他们自己的交易 - 但请参阅here了解更多信息。
例如,使用您提供的内容:
DECLARE @success bit
BEGIN TRAN T1
BEGIN try
EXEC [dbo].[usp_MyProc]
SET @success = 1
PRINT 'SUCCESS'
END try
BEGIN catch
SET @success = 0
PRINT 'FAIL'
END catch
IF @success = 1
BEGIN
COMMIT TRAN T1
END
ELSE
BEGIN
ROLLBACK TRAN T1
END
PRINT @@TRANCOUNT
在这两种情况下,最终都应为TRANCOUNT
。
答案 1 :(得分:0)