在SQL Server中锁定升级和EAV模型

时间:2016-04-29 14:22:53

标签: sql-server locking entity-attribute-value

我们正在开发一个Web应用程序,它允许使用用户定义的模式存储对象树。 EAV模型用于在SQL Server中实现此方案。它导致单个对象存储在恒定数量的表中(即"对象表","值表","实体表","属性表"依此类推)。我们的工作量假设从不同的数据源(Excel和一堆专有格式)定期导入对象树,这可能非常大。为了确保进口树木的合规性(请记住它的EAV),我们在一次大型交易中进行。用户通常也会删除此类导入的结果,这可能会占用大量资源。

这些插入和删除会在EAV表上产生大量锁定,从而导致最终锁定升级(达到升级阈值后)。此事务专门锁定EAV表,使用户甚至无法读取数据,从用户的角度来看,事务中不涉及事务(事实上所有数据)。

我只想到两种方法来缓解这个问题

  • 禁用EAV表上的锁定升级。这个我强烈 因为它给记忆消费带来的不确定性而不喜欢 和锁管理员的运作。
  • 允许READ COMMITED SNAPSHOT。这种隔离级别允许 非阻塞读取(具有MVCC开销),但我仍然不能在整个表上发布更新,因为AFAIK升级是留在那里的 和作家将阻止作家。

任何人都可以告诉我是否有其他选项让大型INSERT / DELETE不会阻止整个表格,或者可能是我出错了?

0 个答案:

没有答案