如何防止 table 锁定多个用户同时写入和读取 table?
How to prevent table locking with multiple users writing and reading from table at the same time?
我有一个我为一个小组编写的程序,该程序不断地向我们的 SQL 服务器写入、读取和删除每个用户的每个会话。我不需要担心正在写入或删除的内容,因为一个人 written/deleted 的所有数据永远不会被另一个人需要。每个用户的写入都由一个唯一 ID 分隔,所有查询都基于该唯一 ID。
我希望多个用户能够同时从同一 table 中 write/delete 行。我知道我可以将会话设置为能够在使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
写入数据时进行读取。
问题:
也就是说我可以同时拥有来自同一个 table 的多个用户 write/delete 吗?
目前,如果这不可能,我唯一的想法是设置工具以在每个用户会话中写入临时 tables。但我不认为这是每天数百次不断创建和删除临时文件 tables 的有效选择。
是的,您可以使这种多租户方法正常工作。
- 确保所有索引的前导列是
UserId
,这样一个用户的查询永远不需要扫描属于不同用户的行。
- 确保所有查询在
UserId
上都有一个相等谓词并验证执行计划以确保它们正在寻找它。
- 确保不使用可序列化隔离级别,因为这可能会影响相邻用户的范围锁。
- 确保未在所有索引上禁用行锁定并将 DML 操作限制在 <= 5,000 行(以防止锁定升级)
- 考虑为您的阅读查询使用已提交的读取快照隔离
我有一个我为一个小组编写的程序,该程序不断地向我们的 SQL 服务器写入、读取和删除每个用户的每个会话。我不需要担心正在写入或删除的内容,因为一个人 written/deleted 的所有数据永远不会被另一个人需要。每个用户的写入都由一个唯一 ID 分隔,所有查询都基于该唯一 ID。
我希望多个用户能够同时从同一 table 中 write/delete 行。我知道我可以将会话设置为能够在使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
写入数据时进行读取。
问题:
也就是说我可以同时拥有来自同一个 table 的多个用户 write/delete 吗?
目前,如果这不可能,我唯一的想法是设置工具以在每个用户会话中写入临时 tables。但我不认为这是每天数百次不断创建和删除临时文件 tables 的有效选择。
是的,您可以使这种多租户方法正常工作。
- 确保所有索引的前导列是
UserId
,这样一个用户的查询永远不需要扫描属于不同用户的行。 - 确保所有查询在
UserId
上都有一个相等谓词并验证执行计划以确保它们正在寻找它。 - 确保不使用可序列化隔离级别,因为这可能会影响相邻用户的范围锁。
- 确保未在所有索引上禁用行锁定并将 DML 操作限制在 <= 5,000 行(以防止锁定升级)
- 考虑为您的阅读查询使用已提交的读取快照隔离