我有这张桌子:
No ID itemNum
0 1 A7855 item1
1 2 item2
2 3 A7856 item3
3 4 item4
4 5 item5
我在表中有一行(1,2)。现在,我想插入一些其他值,并在事务中执行该操作。我用这个:
TableAB
{
IDTableA;
IDTableB;
}
在第一个插入中出现完整性错误,但是在第二个和第三个插入中,将值插入表中。
我如何使用交易,但第一个交易失败,为什么要插入其他两行?我以为在事务中,如果某事失败,那么一切都将中止。那么在这种情况下,使用事务和不使用事务有什么区别?
谢谢。
答案 0 :(得分:2)
我认为您应该将内容包装在tags
中。
TRY...CATCH
答案 1 :(得分:1)
您需要使用TRY
和CATCH
,在CATCH
中,您必须ROLLBACK
进行上述交易。完成此操作的另一种方法是如下所述SET XACT_ABORT ON
。
SET XACT_ABORT ON
BEGIN TRAN
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,2);
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
insert into TableAB (IDTAbleA, IDTAbleB) VALUES(1,3);
COMMIT TRAN
答案 2 :(得分:1)
尝试一下:
SET XACT_ABORT ON
BEGIN TRANSACTION;
BEGIN TRY
INSERT INTO TableAB(IDTAbleA,IDTAbleB)VALUES(1, 2);
INSERT INTO TableAB(IDTAbleA,IDTAbleB)VALUES(1, 3);
INSERT INTO TableAB(IDTAbleA,IDTAbleB)VALUES(1, 3);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
IF (XACT_STATE()) = -1
BEGIN
ROLLBACK TRANSACTION;
THROW;
END
ELSE IF (XACT_STATE()) = 1
BEGIN
COMMIT TRANSACTION;
END;
END;
END CATCH;
了解更多:
XACT_ABORT :https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-2017
XACT_STATE():https://docs.microsoft.com/en-us/sql/t-sql/functions/xact-state-transact-sql?view=sql-server-2017
@@ TRANCOUNT :https://docs.microsoft.com/en-us/sql/t-sql/functions/trancount-transact-sql?view=sql-server-2017