这里是条纹出为什么SQL事务没有被回滚?
USE databaseName
BEGIN TRY
DECLARE @count INT
DECLARE @ErrorMsg VARCHAR(MAX)
SET @count=(SELECT COUNT(*)
FROM xxxtable
WHERE xxxcolumn = 'xxx')
IF(@count = 0) --This means that the script has not been run yet
BEGIN
BEGIN TRANSACTION
--do work in here
COMMIT TRANSACTION
END
ELSE
BEGIN
SELECT 'This script has already been run before. Cannot run it again.'
END
END TRY
BEGIN CATCH
IF(Xact_state() <> 0)
BEGIN
ROLLBACK TRAN
PRINT('ROLLED BACK TRANSACTION')
SELECT Error_number() AS error_number,
Error_line() AS error_line,
Error_message() AS error_message
END
END CATCH
不必要的部分脚本当脚本失败,它进入catch块并打印回退的事务,并且还显示了选择语句的结果(错误消息等)。
但是当我检入数据库时,直到失败点的数据被提交。我在这里做错了什么?
更新:回滚数据后,可用的最新身份值发生变化。 (假设可用的最高身份是10,如果我插入并回滚,则可用的最高身份是11而不是10)。所以回滚不会将数据库返回到事务之前的状态。这是导致问题的原因。
是否有可能在剥离代码中提交隐藏?你有没有试图监控你的语句的执行情况,看看你的数据库发生了什么改变? – Gambrinus 2012-03-06 14:55:20
在条形码中没有提交。最后只有一个提交,如上面的脚本所示:( – developer747 2012-03-06 14:57:22
当脚本失败时,你会得到什么错误信息 – HLGEM 2012-03-06 15:20:11