提交/回滚会影响哪些事务?

时间:2013-08-01 13:45:56

标签: sql-server-2008

它是否只影响相关BEGIN事务后的任何命令?

例如:

BEGIN TRAN
UPDATE orders SET orderdate = '01-08-2013' WHERE orderno > '999'

现在,假设其他人执行数据导入,将10,000条新记录插入另一个表中。

如果我随后发出ROLLBACK命令,那么这些记录会被丢弃,还是只是上面的命令被回滚?

很抱歉,如果这是一个愚蠢的问题,我只是刚刚开始使用COMMIT和ROLLBACK。

1 个答案:

答案 0 :(得分:3)

任何交易都限于它打开的连接。

任何关系数据库管理系统的四个ACID属性之一是隔离。这意味着您的行为与其他连接隔离,反之亦然,直到您提交为止。您所做的任何更改对于其他连接都是不可见的,如果您将其回滚,它们将永远不会知道它发生了。这意味着,在提交之前,发生在其他地方的更改对您来说是不可见的。特别是这意味着你不能回滚任何其他人的变化。

隔离是通过两种方式之一实现的。一种方法是“锁定”资源(例如行)。如果发生这种情况,任何其他尝试从该行读取的连接都必须等到您完成事务。 另一种方法是创建包含旧值的行的副本。在这种情况下,在您提交事务之前,所有其他连接都将看到旧版本。

SQL Server可以使用两种隔离方法。使用哪一个取决于您选择的隔离级别。两个快照隔离级别提供“复制方法”,其他四个使用“锁定方法”。 “已提交读取”的默认隔离级别是“锁定方法”隔离级别之一。

请注意,隔离级别“READ UNCOMMITTED”基本上绕过了这些机制,并允许您读取其他人启动但尚未提交的更改。这是一个特殊的隔离级别,在诊断问题时很有用,但在生产代码中应该避免使用。