我是新来的,所以请温柔! :) 好的,所以我现在已经进入了SQL Server社区/世界大约2年(SQL Server Dev和DBA - 2005+版本),最近我还发现了ACID理论,我只是想知道如何SQL Server ACID兼容?作为默认设置,它总是带有XACT_ABORT OFF选项,对吧?下面是从MSDN的例子:XACT_ABORT关闭ACID不兼容?
IF OBJECT_ID(N't2', N'U') IS NOT NULL
DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
DROP TABLE t1;
GO
CREATE TABLE t1
(a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
(a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
select * from t2;
和结果集:
a
1
3
哪里是在这种情况下,原子?也许我弄错了整个ACID理论?
PS:我问这个问题的原因不仅仅是因为ACID属性,还因为我过去曾多次使用这个XACT_ABORT选项挣扎,特别是当它通过ODBC连接与应用程序的CLR代码结合时 - 但脱离主题:)
这取决于您所期望的东西。如果您希望事务在出现错误SET XACT_ABORT ON;时中止。重要的是,你永远不会把田野写成一半。每一个陈述都是ACID。 'XACT_ABORT'设置不会改变引擎的隐藏工作,因此我们甚至不必考虑为我们避免的所有可能的不一致情况。 – Jodrell 2013-04-25 11:20:17
事实上,如果ACID理论在上述情况下与SQL Server兼容,我更加好奇。我错了吗,整个Atomicity的事情?根据我所得到的,说“全部或全部”,这意味着如果一个事务失败了,它的所有内容都应该被回滚,在上面的情况下,显然它不会。而我想强调的是,XACT_ABORT默认为OFF。 – Sergiu 2013-04-25 11:22:02
你说得对,默认设置为OFF,TRANSACTION语句不是原子的。它确实允许你捕捉和处理,但这是不完美的http://stackoverflow.com/a/919279/659190 – Jodrell 2013-04-25 11:25:38