Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 交易不存在';即使出现错误也不能回滚?_Sql_Tsql - Fatal编程技术网

Sql 交易不存在';即使出现错误也不能回滚?

Sql 交易不存在';即使出现错误也不能回滚?,sql,tsql,Sql,Tsql,我创建了这个事务(我的第一个事务),在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 T

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

您必须使用XACT_ABORT set选项来确保它回滚。如果没有它,某些错误将不会导致回滚

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

如果我理解正确,您可以假设,当教师表中没有Id=111的行时,尝试更新教师表中的行是错误的

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


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

我想到了这一点,所以我将
Teacher
表更改为一个不存在的表:
TeacherO
,但这不会改变任何东西,或者这不是错误事务处理的类型?如果您试图对一个不存在的表使用
UPDATE
,这甚至不应该编译。。。错误是,如果您试图为现有行设置错误的值。假设有一个Id=2的教师,您将在Id=2的情况下得到一个真正的错误
UPDATE teacher SET Id='test'这在任何情况下都应无效。。。