考虑以下场景:
- 10,000 个用户同时尝试在我们的应用程序上创建配置文件,数据必须插入到表 userProfile 中。
- 处理这个插入的 SP 需要半秒的时间来执行。
根据我对锁定和事务的理解,每次插入都会锁定该表。这意味着到创建最后一个用户的配置文件时需要一段时间。SQL Server 如何处理并发更新和锁定?如果对此有任何见解,我将不胜感激。谢谢!
考虑以下场景:
根据我对锁定和事务的理解,每次插入都会锁定该表。这意味着到创建最后一个用户的配置文件时需要一段时间。SQL Server 如何处理并发更新和锁定?如果对此有任何见解,我将不胜感激。谢谢!
这是一个相当广泛的领域,关于这个主题已经写了整本书,并且已经写了很多关于具体细节的短篇和长篇文章,所以我只回答你的具体要点,并希望给你一些关键字来搜索进一步阅读。
那不是真的。锁可以小到一页或一行,不一定是整个表,因此读取其他页面的并发活动可能仍然能够同时继续——所以应用程序可能会读取您的个人资料行,允许您登录或其他人查看您的简历,同时正在创建其他人的个人资料。
不同的事务和锁定选项可以帮助许多插入的并发,例如快照隔离将允许可能锁定等待添加新行的读取(例如读取整个表的查询,尽管这些应该很少见)完成但只是在事务开始时看到数据库的提交状态。
递增整数索引存在一个特定问题,通常用作此类表的主键,这可能导致创建许多新行的争用:查找“最后一页争用”以获取更多信息。SQL Server 2019及以上版本对此有专门的索引优化,OPTIMIZE_FOR_SEQUENTIAL_KEY。尽管如果您处于担心整个表锁的级别,那么您需要了解这里的详细信息还有很长的路要走。
这个问题不应该影响其他并发查询:如上所述,不需要关心索引最后一页的读取不应该被锁定等待这个活动完成,除非你真的淹没了服务器的可用资源。
此外,您的应用程序基础结构的其余部分是否真的支持 10K 并发请求以将负载分配给 SQL Server?!您的 Web 服务器(假设是这种应用程序)能否接受并处理那么多并发连接等?
如果您只是为新配置文件创建一行,半秒是太长的两个或三个数量级,除非您运行在非常非常非常旧/奇怪的硬件上或使用超卖的 VPS 提供商。它应该更像是百分之几秒或更短。
如果它在创建该行的同时执行一些其他更复杂的逻辑,那么仔细的设计应该允许您最小化它在用户配置文件表上持有锁的时间长度。如果该过程的逻辑如此复杂,那么您需要更多地担心设计以减少死锁而不是大规模并发,因此也许可以简化该过程。当然,您可以尝试通过将所有事务的隔离级别设置为可串行化来天真地解决死锁问题,但这样您就产生了您开始担心的问题(使接触该表的每个语句都等待其他语句完成)。
Microsoft 关于事务锁定和行版本控制指南的 Learn 文档可能是开始一般阅读的好地方。如果最初对您来说有点深,请尝试搜索相关关键字以找到更多教程设计的描述,并在您对基础知识有更多了解后返回到更干燥的参考资料,当然当您有更具体的问题时返回这里.