0

我的数据库中有 2 个表。它们是项目和字段。Item 是实现树的自引用表。这意味着在 Item 表中,我有 ID 和 ParentId 列。这样,我们就可以在Item表中存储一棵树。字段是一个表,用于存储项目的其他扩展属性。字段表有一个名为“Item_ID”的列来引用项目表。

好的,现在我们只想将事务添加到数据库操作中。我们发现了一些奇怪的行为作为标题。

正如 Microsoft 要求的那样,我们运行以下 sql 来启用数据库的快照隔离:

ALTER DATABASE AdventureWorks2008R2
SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE AdventureWorks2008R2
SET ALLOW_SNAPSHOT_ISOLATION ON;

然后我们做如下测试:</p>

  1. 打开 2 个测试程序

  2. 第一个程序更新 Item 1 并在事务提交之前被阻塞。

  3. 使用第二个程序尝试删除第 2 项。第 1 项与第 2 项没有关系。这意味着第 1 项不是第 2 项的父/子。

  4. 然后我们发现第二个程序被第一个程序阻止了。如果我们继续第一个程序,那么如果没有超时,我们第二个程序将完成。

我对这个结果感到奇怪。因为我认为即使第 1 项正在交易中,我也可以删除第 2 项。谁知道为什么会这样?

4

1 回答 1

0

听起来您根本没有获得 SNAPSHOT ISOLATION (因为冲突更新/删除应该导致失败,而不是最终完成)。

你并没有真正执行ALTER DATABASE AdventureWorks2008R2...——是吗?

由于“AdventureWorks2008R2”需要替换为您的数据库名称...

于 2013-07-17T00:39:21.323 回答