我的数据库中有 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>
打开 2 个测试程序
第一个程序更新 Item 1 并在事务提交之前被阻塞。
使用第二个程序尝试删除第 2 项。第 1 项与第 2 项没有关系。这意味着第 1 项不是第 2 项的父/子。
然后我们发现第二个程序被第一个程序阻止了。如果我们继续第一个程序,那么如果没有超时,我们第二个程序将完成。
我对这个结果感到奇怪。因为我认为即使第 1 项正在交易中,我也可以删除第 2 项。谁知道为什么会这样?