为什么在快照隔离sql server数据库中更新事务块删除操作?

时间:2012-03-14 13:32:02

标签: sql sql-server transactions snapshot-isolation

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

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

正如微软所说,我们运行以下sql来启用数据库的快照隔离:

ALTER DATABASE AdventureWorks2008R2
SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE AdventureWorks2008R2
SET ALLOW_SNAPSHOT_ISOLATION ON;

然后我们进行以下测试:

  1. 打开2个测试程序

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

你没有字面意思执行ALTER DATABASE AdventureWorks2008R2... - 是吗?

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