如果我只是用以下内容包装我的查询:
BEGIN TRANSACTION
COMMIT TRANSACTION
如果内部有任何失败,它会自动回滚吗?
从查看其他代码,他们似乎检查错误,如果有错误,那么他们执行GOTO语句,然后调用ROLLBACK TRANSACTION
但这似乎是分配工作,每次插入/更新后都必须检查IF(@@ ERROR<> 0)。
答案 0 :(得分:27)
我通常在存储过程中执行类似的操作。它保持了良好和安全,并传递了我遇到的任何错误。
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- Code goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
DECLARE
@ERROR_SEVERITY INT,
@ERROR_STATE INT,
@ERROR_NUMBER INT,
@ERROR_LINE INT,
@ERROR_MESSAGE NVARCHAR(4000);
SELECT
@ERROR_SEVERITY = ERROR_SEVERITY(),
@ERROR_STATE = ERROR_STATE(),
@ERROR_NUMBER = ERROR_NUMBER(),
@ERROR_LINE = ERROR_LINE(),
@ERROR_MESSAGE = ERROR_MESSAGE();
RAISERROR('Msg %d, Line %d, :%s',
@ERROR_SEVERITY,
@ERROR_STATE,
@ERROR_NUMBER,
@ERROR_LINE,
@ERROR_MESSAGE);
END CATCH
答案 1 :(得分:4)
是的,在它不起作用的情况下显式回滚事务是很重要的。
我经常告诉我的儿子你只需要刷牙就可以了。
在这种情况下,您只需要回滚不想执行的命令。
答案 2 :(得分:4)
如果出现错误,这将自动回滚事务
SET XACT_ABORT ON
BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
答案 3 :(得分:1)
对于事务控制,您使用begin,commit和rollback。您通过提供BEGIN TRANSACTION开始交易。然后你把你需要的各种SQL语句。然后通过发出提交或回滚来结束事务。 COMMIT TRANSACTION将提交您在BEGIN语句之后对数据库所做的所有更改,并将它们永久化,可以这么说。 ROLLBACK TRANSACTION将在BEGIN语句之后回滚您对数据库所做的所有更改。但是,它不会更改变量值。
示例:
BEGIN TRANSACTION
UPDATE table SET column = 'ABC' WHERE column = '123'
COMMIT TRANSACTION
--//column now has a value of 'ABC'
BEGIN TRANSACTION
UPDATE table SET column = 'ABC' WHERE column = '123'
ROLLBACK TRANSACTION
--//column still has it's previous value ('123') No changes were made.