sql-server - SQL Server 如何锁定行?
问题描述
我有一个问题想了解如何优化数据库。我们有一个 SQL Server,主要数据是垂直排序的。所以一条记录有这些列
ID version fieldindex fieldvalue
并且ID, version, fieldindex
是主键。
因此,如果要加载逻辑记录集,则必须加载 ID + 版本的所有行。一个“记录”可能包含大约 60 行。恐怕这会导致数据库性能出现一些问题。
大约有 10 个用户在应用程序中并行工作,我们经常遇到死锁。我们甚至会在插入新行时遇到死锁,因此通常无法锁定非持久记录。
所以我的问题是,SQL Server 如何锁定记录?即使我没有特别选择该记录,是否有可能锁定记录?
如果有人能解释数据库是如何工作的,我会很高兴。
解决方案
通常,您希望聚集索引为 (EntityID, AttributeId),因此实体的所有属性都位于同一位置。但是为了避免死锁,您可能需要在修改属性时对主实体行进行 X 锁定,否则 SQL Server 将在 AttributeValue 表上使用行锁定,这可能导致死锁和逻辑不一致。您可以通过将行修改为事务中的第一个操作来 X 锁定它,或者使用 XLOCK 提示读取它。
根据系统中“版本”的角色,它也将位于聚集索引中的某个位置。如果属性是单独版本化的,那么最后。如果个别实体是 viersioned 然后在中间。如果一个版本包含多个实体,则作为前导列。
推荐阅读
- javascript - 编程多个警报的最佳方式
- javascript - 一种检查javascript文件是否按顺序加载的方法?
- python - 尝试使用 python 2 枚举/循环遍历字母、数字等
- sql - Postgres 查询运行时间超过 statement_timeout
- bash - kill -9 但使用名称而不是数字
- java - 从 ArrayList 存储和读取
- uiscrollview - 试图让 UITextView 在键盘放在自身之上时移动内容
- python-3.x - tensorflow服务 - 批处理重塑错误
- android - 运行片段的插桩测试用例时出错
- amazon-web-services - AWS:在将数据从 DynamoDB 发送到 Cloudsearch 之前对其进行转换