如果我只是用以下内容包装我的查询:
BEGIN TRANSACTION
COMMIT TRANSACTION
如果其中有任何故障,它会自动回滚吗?
通过查看其他代码,他们似乎在检查错误,如果有错误,那么他们执行 GOTO 语句,然后调用 ROLLBACK TRANSACTION
但这似乎是一项工作,必须在每次插入/更新后检查 IF(@@ERROR <> 0)。
如果我只是用以下内容包装我的查询:
BEGIN TRANSACTION
COMMIT TRANSACTION
如果其中有任何故障,它会自动回滚吗?
通过查看其他代码,他们似乎在检查错误,如果有错误,那么他们执行 GOTO 语句,然后调用 ROLLBACK TRANSACTION
但这似乎是一项工作,必须在每次插入/更新后检查 IF(@@ERROR <> 0)。
我通常在我的存储过程中做这样的事情。它使事情保持良好和安全,并传递我遇到的任何错误。
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
是的,在它不起作用的情况下显式回滚事务很重要。
我通常告诉我儿子,你只需要刷你想要保留的牙齿。
在这种情况下,您只需回滚您不想执行的命令。
如果关闭错误,这将自动回滚事务
SET XACT_ABORT ON
BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
对于事务控制,您使用开始、提交和回滚。您通过提供 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.