Begin Tran 和提交 Tran 的困惑
Posted
技术标签:
【中文标题】Begin Tran 和提交 Tran 的困惑【英文标题】:Confusion in Begin Tran and commit Tran 【发布时间】:2014-05-26 06:35:48 【问题描述】:据我所知,如果我们以 begin tran/commit tran 开始语句,它将完全完成或什么都不做。但是当我在 TSQL 代码下执行时,它会更新第一个表 n 的记录,既不提交也不回滚。我也尝试过 @@error 0 但它也不起作用..请帮帮我。
BEGIN TRAN
UPDATE A SET NAME ='ABC' WHERE ID=2
INSERT INTO TTT VALUES('GJ')
COMMIT TRAN
TABLE TTT DOES NOT EXIST.
我已使用此表在此代码块中抛出错误。
【问题讨论】:
您在哪里“通知”事务以在错误时回滚?我没有看到那行代码。 你怎么知道记录已经更新了?您是从同一个会话还是另一个会话进行检查? 【参考方案1】:你的理解部分正确,部分错误。
事务在提交或回滚之前保持打开状态。您可以手动提交或回滚(COMMIT
或ROLLBACK
),在某些情况下事务会自动回滚。您没有手动回滚,也没有任何东西可以在您的特定系统上强制自动回滚。
对于像您这样的代码,SET XACT_ABORT ON
选项很有用:这会导致错误自动回滚当前事务。
【讨论】:
下面的代码是否正确.. 我在下面的代码中也得到了相同的结果.. 提前谢谢 BEGIN BEGIN TRAN UPDATE T1 SET refid ='VIN23456Y' INSERT INTO TTT VALUES ('SDFS' ) IF(@@ERROR0) BEGIN ROLLBACK END ELSE BEGIN commit TRAN END END @VimalKumarPrajapati 不是。你假设你已经到了可以检查错误的地步,但如果错误足够严重,你就不会走那么远。 您可以使用DBCC OPENTRAN
或所有数据库:SELECT * FROM sys.sysprocesses WHERE open_tran = 1
获取所选数据库的当前打开事务列表。检查您的连接是否有未结交易。
@Pred 如果您要检查自己的进程,只需使用@@TRANCOUNT
-- 但无需检查。
@VimalKumarPrajapati 快速搜索即可找到sommarskog.se/error-handling-I.html#statementbatch以上是关于Begin Tran 和提交 Tran 的困惑的主要内容,如果未能解决你的问题,请参考以下文章
可以在 SQL Server 中没有相应的 BEGIN TRAN 的情况下提交事务吗?
SQL事务用法begin tran,commit tran和rollback tran的用法
存储开头结尾使用begin tran,rollback tran作用?
BEGIN TRAN...COMMIT TRAN 意思与用法
SQL Server Try/Catch、Begin/Tran、RaiseError、Loop 和 Return。正确的顺序是啥?