它是否只影响相关BEGIN事务后的任何命令?
例如:
BEGIN TRAN
UPDATE orders SET orderdate = '01-08-2013' WHERE orderno > '999'
现在,假设其他人执行数据导入,将10,000条新记录插入另一个表中。
如果我随后发出ROLLBACK命令,那么这些记录会被丢弃,还是只是上面的命令被回滚?
很抱歉,如果这是一个愚蠢的问题,我只是刚刚开始使用COMMIT和ROLLBACK。
答案 0 :(得分:3)
任何交易都限于它打开的连接。
任何关系数据库管理系统的四个ACID属性之一是隔离。这意味着您的行为与其他连接隔离,反之亦然,直到您提交为止。您所做的任何更改对于其他连接都是不可见的,如果您将其回滚,它们将永远不会知道它发生了。这意味着,在提交之前,发生在其他地方的更改对您来说是不可见的。特别是这意味着你不能回滚任何其他人的变化。
隔离是通过两种方式之一实现的。一种方法是“锁定”资源(例如行)。如果发生这种情况,任何其他尝试从该行读取的连接都必须等到您完成事务。 另一种方法是创建包含旧值的行的副本。在这种情况下,在您提交事务之前,所有其他连接都将看到旧版本。
SQL Server可以使用两种隔离方法。使用哪一个取决于您选择的隔离级别。两个快照隔离级别提供“复制方法”,其他四个使用“锁定方法”。 “已提交读取”的默认隔离级别是“锁定方法”隔离级别之一。
请注意,隔离级别“READ UNCOMMITTED”基本上绕过了这些机制,并允许您读取其他人启动但尚未提交的更改。这是一个特殊的隔离级别,在诊断问题时很有用,但在生产代码中应该避免使用。