改变序列化是我只能作为最后的手段。 在这种情况下,我坚持使用单个事务来更新父ID,但是将代码放在更新触发器中更新文件夹路径。
当你使用 Serializable 这样做是为了保持 的 共享 强> 锁(来自 SELECT )在您已阅读的行上,直到事务完成。但是一行上有共享锁 的 不 强> 阻止另一个事务读取同一行......它只是阻止另一个事务获得一个 的 独家 强> 锁定该行(共享锁)以进行更新或删除。
Serializable
SELECT
如果你想阻止任何其他交易甚至阅读( SELECT )在这些行上,你需要强制执行 的 独家 强> 当你锁定 SELECT :
SELECT * FROM dbo.Folders WITH (XLOCK) WHERE ....
现在如果 这个 交易“保持开放”, 的 没有其他 强> transaction可以读取由其选择的任何行 WHERE 条件 - 直到那个 SELECT .. FROM dbo.Folders WITH (XLOCK) 事务已提交或回滚。
WHERE
SELECT .. FROM dbo.Folders WITH (XLOCK)
如果你执行以下操作,它会完全符合你的要求(阻止读者和作者看到行: 在第1场会议中:
create table dbo.test(i1 int, a1 varchar(25)) insert into dbo.test values (1,'NY'),(1,'NY'),(1,'NJ'),(2,'NY'),(2,'NY'),(2,'NJ') set transaction isolation level serializable begin transaction select * from test where i1=1 update dbo.test set i1=3 where a1='NJ'
在第2次尝试中
select * from dbo.test where i1=1
挂....
添加开始尝试和捕获只能改善的东西,但即使没有它可序列化的工作。您没有向我们展示您的所有代码。