首页 > 解决方案 > SQL Server 如何锁定行?

问题描述

我有一个问题想了解如何优化数据库。我们有一个 SQL Server,主要数据是垂直排序的。所以一条记录有这些列

ID  version  fieldindex  fieldvalue

并且ID, version, fieldindex是主键。

因此,如果要加载逻辑记录集,则必须加载 ID + 版本的所有行。一个“记录”可能包含大约 60 行。恐怕这会导致数据库性能出现一些问题。

大约有 10 个用户在应用程序中并行工作,我们经常遇到死锁。我们甚至会在插入新行时遇到死锁,因此通常无法锁定非持久记录。

所以我的问题是,SQL Server 如何锁定记录?即使我没有特别选择该记录,是否有可能锁定记录?

如果有人能解释数据库是如何工作的,我会很高兴。

标签: sql-server

解决方案


  1. 你有EAV,这通常被认为是坏的

  2. 要使 EAV 工作得可以接受,您需要正确的索引结构,并且可能需要注意锁定提示和事务。

通常,您希望聚集索引为 (EntityID, AttributeId),因此实体的所有属性都位于同一位置。但是为了避免死锁,您可能需要在修改属性时对主实体行进行 X 锁定,否则 SQL Server 将在 AttributeValue 表上使用行锁定,这可能导致死锁和逻辑不一致。您可以通过将行修改为事务中的第一个操作来 X 锁定它,或者使用 XLOCK 提示读取它。

根据系统中“版本”的角色,它也将位于聚集索引中的某个位置。如果属性是单独版本化的,那么最后。如果个别实体是 viersioned 然后在中间。如果一个版本包含多个实体,则作为前导列。


推荐阅读