【发布时间】:2012-05-23 11:05:20
【问题描述】:
以下声明:
INSERT INTO dbo.Changes([Content], [Date], [UserId], [CompanyId])
VALUES (@1, @2, @3, @4);
SELECT @@identity;
给我这个 SQL 错误 3960:
快照隔离事务由于更新冲突而中止。你 无法使用快照隔离直接访问表 'dbo.Companies' 或间接在数据库“myDatabase”中更新、删除或插入 已被另一个事务修改或删除的行。 重试事务或更改隔离级别 更新/删除语句。
据我了解,根据错误消息,在另一个连接正在修改dbo.Companies 期间,我不应该更新、删除或插入表dbo.Companies。
但是为什么当我向另一个表dbo.Changes(具有dbo.Companies 的外键)插入新行并且我没有删除dbo.Companies 中的引用行时会发生这种情况,但我只是在更新行dbo.Companies 而不是主键?这应该可以正常工作,不是吗? (这是 SQL Server 中的错误吗?)
更新:
表格如下所示:
dbo.Changes([Id] int PK, [Content] nvarchar,
[Date] datetime, [UserId] int, [CompanyId] int -> dbo.Companies.[Id])
dbo.Companies([Id] int PK, [Name] nvarchar)
第二次更新在做:
UPDATE dbo.Companies WHERE [Id] = @1 SET [Name] = @2;
【问题讨论】:
标签: sql-server tsql transactions transaction-isolation snapshot-isolation