AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 320980
Accepted
lifeisajourney
lifeisajourney
Asked: 2022-12-15 12:23:56 +0800 CST2022-12-15 12:23:56 +0800 CST 2022-12-15 12:23:56 +0800 CST

在 SQL Server 的并发会话中更新同一个表

  • 772

考虑以下场景:

  1. 10,000 个用户同时尝试在我们的应用程序上创建配置文件,数据必须插入到表 userProfile 中。
  2. 处理这个插入的 SP 需要半秒的时间来执行。

根据我对锁定和事务的理解,每次插入都会锁定该表。这意味着到创建最后一个用户的配置文件时需要一段时间。SQL Server 如何处理并发更新和锁定?如果对此有任何见解,我将不胜感激。谢谢!

sql-server-2012
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    David Spillett
    2022-12-15T13:50:54+08:002022-12-15T13:50:54+08:00

    这是一个相当广泛的领域,关于这个主题已经写了整本书,并且已经写了很多关于具体细节的短篇和长篇文章,所以我只回答你的具体要点,并希望给你一些关键字来搜索进一步阅读。

    根据我对锁定和事务的理解,每次插入都会锁定该表。

    那不是真的。锁可以小到一页或一行,不一定是整个表,因此读取其他页面的并发活动可能仍然能够同时继续——所以应用程序可能会读取您的个人资料行,允许您登录或其他人查看您的简历,同时正在创建其他人的个人资料。

    不同的事务和锁定选项可以帮助许多插入的并发,例如快照隔离将允许可能锁定等待添加新行的读取(例如读取整个表的查询,尽管这些应该很少见)完成但只是在事务开始时看到数据库的提交状态。

    10,000 个用户尝试创建一个配置文件……必须将数据插入到表 userProfile 中。

    递增整数索引存在一个特定问题,通常用作此类表的主键,这可能导致创建许多新行的争用:查找“最后一页争用”以获取更多信息。SQL Server 2019及以上版本对此有专门的索引优化,OPTIMIZE_FOR_SEQUENTIAL_KEY。尽管如果您处于担心整个表锁的级别,那么您需要了解这里的详细信息还有很长的路要走。

    这个问题不应该影响其他并发查询:如上所述,不需要关心索引最后一页的读取不应该被锁定等待这个活动完成,除非你真的淹没了服务器的可用资源。

    此外,您的应用程序基础结构的其余部分是否真的支持 10K 并发请求以将负载分配给 SQL Server?!您的 Web 服务器(假设是这种应用程序)能否接受并处理那么多并发连接等?

    处理这个插入的 SP 需要半秒的时间来执行。

    如果您只是为新配置文件创建一行,半秒是太长的两个或三个数量级,除非您运行在非常非常非常旧/奇怪的硬件上或使用超卖的 VPS 提供商。它应该更像是百分之几秒或更短。

    如果它在创建该行的同时执行一些其他更复杂的逻辑,那么仔细的设计应该允许您最小化它在用户配置文件表上持有锁的时间长度。如果该过程的逻辑如此复杂,那么您需要更多地担心设计以减少死锁而不是大规模并发,因此也许可以简化该过程。当然,您可以尝试通过将所有事务的隔离级别设置为可串行化来天真地解决死锁问题,但这样您就产生了您开始担心的问题(使接触该表的每个语句都等待其他语句完成)。

    SQL Server 如何处理并发更新和锁定?如果对此有任何见解,我将不胜感激。

    Microsoft 关于事务锁定和行版本控制指南的 Learn 文档可能是开始一般阅读的好地方。如果最初对您来说有点深,请尝试搜索相关关键字以找到更多教程设计的描述,并在您对基础知识有更多了解后返回到更干燥的参考资料,当然当您有更具体的问题时返回这里.

    • 4

相关问题

  • SQL Server 2012 在 TempDb 中使用排序创建索引 - 获得 False?

  • SQL Server AlwaysOn 故障转移透明度

  • 为什么 Denali 序列应该比标识列表现更好?

  • SQL Server 不应该支持范围吗?

  • 什么是 SQL Server“德纳利”?什么是新的?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve