即使出现错误,事务也不会回滚?

时间:2016-11-13 21:02:13

标签: sql tsql

我创建了这个事务(我的第一个事务),Id = 111表中没有Teacher行,但是它在Subject表上工作并插入了一个新行。它不应该回滚所有的变化吗?

BEGIN TRANSACTION
INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4)
UPDATE Teacher SET Name ='Hady' WHERE Id=111
COMMIT TRANSACTION

然后我添加了一些逻辑,但仍然没有工作:

Begin Try
BEGIN TRANSACTION
INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4)
UPDATE TeacherO SET Name ='Hady' WHERE Id=111
COMMIT TRANSACTION
End Try
Begin Catch
ROLLBACK TRANSACTION
End Catch

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您认为,当在教师表中没有Id = 111的行时,尝试更新教师表中的行是错误的...

当您执行禁止或不可能的操作时,会发生错误。如果您尝试在没有强制转换的字符串中添加数字。或者,如果你试图抓住一个不存在的对象。也许您想将30.02.2016转换为日期。一切都将是一个错误。

但是,如果您告诉数据库更新id = 111的所有行,则会发生这种情况:所有id = 111的行都将更新。在您的情况下,受影响的行数将为零。但这不是错误......

答案 1 :(得分:0)

您必须使用XACT_ABORT设置选项以确保其回滚。没有它,一些错误不会导致回滚。

SET XACT_ABORT ON;
BEGIN TRY
    BEGIN TRANSACTION;
    INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4);
    UPDATE TeacherO SET Name ='Hady' WHERE Id=111;
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
END CATCH