我的SQL-Server
学习曲线已经回到前面,几年后我正在努力有效地使用TRANSACTION
代码。
如果没有明确说明COMMIT TRANSACTION
,那么在ROLLBACK TRANSACTION
点如果前面的代码中没有发生错误,那么交易会被提交吗?问题与以下结构有关:
USE MyDataBase;
GO
BEGIN TRANSACTION;
--complex query X here
ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.';
GO
...我认为ROLLBACK TRANSACTION
用于你不希望在前面的脚本中发生错误的情况下对数据库进行更改的情况 - 在上面这将是X
。如果我想在上面明确说明COMMIT TRANSACTION
那么它应该位于何处?
为了让自己更加困惑,我得到了以下内容 - 为什么要回滚两次?创建ROLLBACK
是否会出错?
USE WHAnalysis;
GO
BEGIN TRANSACTION;
IF @@TRANCOUNT = 1
SELECT @@TRANCOUNT
--do a complex query here
ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.';
GO
答案 0 :(得分:0)
没有。在提交之前,事务将保持打开和未提交,这最终可能会导致数据库阻塞。
如果事务是嵌套的,则回滚将回滚到外部事务的开头,而不是内部事务 - 请参阅http://msdn.microsoft.com/en-us/library/ms181299.aspx
我会考虑类似
的结构 begin try
begin tran
-- do query
commit tran
end try
begin catch
if @@trancount>0
begin
rollback
end
-- handle error here
end catch