【发布时间】:2018-10-31 08:00:51
【问题描述】:
在 Microsoft SQL Server 中,我创建了一个测试表
CREATE TABLE [Test]
(
[BookID] [int] NOT NULL,
[Name] [varchar](512) NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([BookID] ASC)
) ON [PRIMARY]
然后当我运行时:
BEGIN TRAN;
INSERT INTO Test (BookID, Name) Values (1,'one');
INSERT INTO Test (BookID, Name) Values (2,'Two');
INSERT INTO Test (BookID, Name) Values (1,'Three');
INSERT INTO Test (BookID, Name) Values (4,'Four');
COMMIT TRAN;
我希望Test 中没有任何内容,因为insert (1, 'Three') 会产生错误
违反主键约束“PK_Test”
但实际上带有BookId = 1, 2, 4 的行在表中。
如果我SET XACT_ABORT ON,那么我会得到预期的行为。
然后换另一段代码的时候报错就好了
由于“ACTIVE_TRANSACTION”,数据库“MyDatabase”的事务日志已满
事务回滚工作
为了确保得到回滚,我应该在 TRY ... COMMIT CATCH ROLLBACK 语句中包含该语句。
但我仍然想知道为什么没有 ROLLBACK 的 BEGIN TRAN 不能一直工作。它真的像我猜的那样取决于错误的类型吗?
【问题讨论】:
-
当您需要多个语句是原子的时,您应该使用 try/catch 块。这就是他们的目的。
标签: sql-server transactions commit rollback