0

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

例如:

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

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

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

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

4

1 回答 1

3

任何事务都仅限于打开它的连接。

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

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

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

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

于 2013-08-01T14:01:04.737 回答