我创建了这个事务(我的第一个事务),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
答案 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