2016-11-13 84 views
1

我创建了这个事务(我的第一个事务),在Teacher表中没有Id = 111行,但是它在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

如果我理解正确的这个,你假设,当有ID为教师表 = 111是一个错误没有排在尝试更新教师表中的行...

发生错误时,当你做一些被禁止或不可能的事情时。如果您尝试向没有强制转换的字符串添加数字。或者如果你试图接触一个不存在的物体。也许你想将30.02.2016转换为日期。所有将是一个错误。

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

+0

我想到了这一点,所以我将'Teacher'表更改为一个不存在的:'TeacherO',但这并没有改变任何东西,或者这不是错误交易工作? –

+1

如果您尝试对不存在的表使用UPDATE,那么它甚至不应该编译...... **错误是,如果您尝试将*错误*值设置为*现有*行** 。假设有一位ID = 2的老师,你会得到一个**真实的**错误,'UPDATE Teacher SET Id ='test'WHERE Id = 2;'这在任何情况下都应该是无效的...... – Shnugo

+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 
相关问题