阅读更多

1顶
0踩

数据库
如果你想构建一个大规模的网站,单凭横向扩展Web服务器是远远不够的。如何巧妙地管理数据库也是非常必要的。锁(Locking)便是实现网站高扩展性的一个关键。

在PostgreSQL中,借助于并发性的改进,通过减少锁及加速执行得到若干令人满意的特性。

一般推荐的做法是:在解决锁问题之前,无论如何先要检查出在你的PostgreSQL数据库服务器上正在运行的是什么,这非常有必要。我建议参考pg_stat_statements并仔细地检查系统瓶颈(bottleneck)。下面是给出的是其运行机制

改进SELECT FOR UPDATE语句

假设两人同时试图修改数据库中同一行的内容,每个用户会首先选择(SELECT)一行来检查它的内容,然后开始更新。令人讨厌的事情是:这两个用户很可能会找到原来的行并且覆盖彼此做的改变。这是一个经典的竞态事件。

在现实生活中,这样会导致恶劣的后果:例如两个人也许会预定了同一架飞机的同一个航班;或者取款时取出的钱可能会比帐户中实际的数额更多。这显然不是我们想要的。

再拿前面的航班机票预定为例,假设有人想要预定飞机的某一座位:
SELECT ...

FROM table

WHERE class = 'economy'

AND empty = true

LIMIT 1

FOR UPDATE

现在的麻烦是:如果另外一个人也试图抢占一个座位,他会发现该座位已经被第一个人选择。但是,这一行是被锁定的。第二个人的SELECT FOR UPDATE操作必须等到第一个人的事务处理完成。值得提醒的是,乘客可能非常乐意接受该航班上的其它任意座位,所以没有必要等待某个特定的座位。

PostgreSQL 9.5将会解决这一问题。下面是一种新的读取行的方式:
SELECT ...

FROM table

WHERE class = 'economy'

AND empty = true

LIMIT 1

FOR UPDATE SKIP LOCKED

这里的巧妙之处在于PostgreSQL将会简单地忽略被锁定的行,并返回一个没有被别人锁定的行。这样是非常有意义的,因为100个同时在查看一个免费座位的用户会得到100个不同的行。这样的结果是你没有死守一个CPU,而是巧妙地横向扩展了系统中的所有CPU。由于冲突不再发生,没有人必须等其他人。

SELECT FOR SHARE

还有一种可以使PostgreSQL提供更高并发的方法。看下面的例子:
SELECT *

FROM account AS a, currency AS c

WHERE a.currency = c.id

AND a.account = 4711

FOR UPDATE

在这个例子中,某人想查看他的银行账户。现在主要的问题是:哪些行是被锁定的?答案是:account和currency。仅仅因为一个人想从ATM中取钱而锁定整个currency表显然并不是个好办法,而应该让很多人可以同时取钱,在这一问题上,PostgreSQL的解决方法是提前告知需要更新哪张表。

方法很简单:
FOR UPDATE OF account FOR SHARE OF currency

通过告诉PostgreSQL我们要做的事情,PostgreSQL数据库会在currency表上使用一个无害的锁。这样大部分人可以同时查看相同的currency而无需相互锁定,同时又保证了account表的安全。

并发就是一切

请记住:如果你只有单个CPU,并发将会是问题。因此,多个CPU能够同时进行资源共享在某种程上来讲是很有必要的。

原文链接:More Concurrency: Improved Locking In PostgreSQL(译者/牛亚真 审校/朱正贵 责编/仲浩)

译者简介:牛亚真,中科院计算机信息处理专业硕士研究生,关注大数据技术和数据挖掘方向。
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 企业网站功能需求设计文档

    企业网站功能需求设计文档 功能设计 主要菜单描述 详细图标说明

  • 没有功能需求设计文档?对不起,拒绝开发!

    在很多软件公司,特别是一些创业型的团队中,对于这样的情景可能大家都很熟悉:项目经理或者产品经理(产品狗)口头或者简单记录一下软件产品的大致要做的功能,直接就让研发团队的兄弟(程序猿)去狂撸代码。然后他就去喝茶撩妹或者回家陪老婆了…这种撸起袖子就开干的方式,看似简单高效,便于直接沟通,能够快速迭代。却不知,发现没有一份正规且实时更新的功能需求设计文档,会付出三四倍的代价来弥补。最终会引发一场产品狗和程

  • 小型电商平台系统需求分析文档

    随着电子信息行业的不断发展,网络通信以及信息技术在人类生活中的普及,利用计算机技术、网络通信技术和Internet实现商务活动的国际化、信息化,已成为各国商务发展的一大趋势, 传统模式的购物已经逐渐被方便快捷的网络购物所取代,电子商务正是为了适应市场需求而蓬勃发展起来,网上购物也随之很快成为一种时尚的购物方式,并为广大网民所接受,随着近年来电子商务的不断发展,大大小小的网络商城都逐渐涌现出来,比较成功的案例有:苏宁易购、淘宝网、卓越网、当当网等,本文将以苏宁易购作为参考,进行小型电子商务网站的开发。 ...

  • 【软件开发/设计】需求文档模板

    项目名称项目目标:简要描述项目的目标和预期成果。背景和目的:介绍项目的背景信息和启动项目的原因。项目范围:明确项目包含和不包含的内容。界定标准:描述项目的边界和限制条件。编写需求文档是一个跨职能的活动,需要不同背景和专业知识的人员共同参与。确保需求文档的准确性、清晰性和完整性是成功项目管理的关键。

  • 系统设计文档

    系统设计文档1 系统需求分析1.1可行性分析1.2项目要解决的问题1.3项目目标2 功能设计2.1功能划分2.2功能描述2.2.1电影信息查询2.2.2用户偏好推荐2.2.3用户登录功能2.3功能设计2.3.1用例图2.3.2 E-R图3 详细设计3.1后台设计3.2前台设计4 数据操作及表格设计4.1数据操作4.2表格设计5 开发环境5.1开发工具5.2结构:三层架构 1 系统需求分析 1.1可行性分析 要成功地实现一个项目,首先应该进行功能上的需求分析,这样才能令设计出的项目满足用户的各项功能需求。可行

  • 功能设计文档_PRD文档范例,产品经理值得收藏的写作手册

    2015年,我写了一篇梳理PRD的文章《PRD到底该怎么写?》,获得3.5万次阅读,423次收藏。至今已过去5年,在这5年里,我一直从事产品产品相关的工作,也经历过一次完整的创业,对PRD又有了一些新的思考。这篇文章是《PRD怎么写》的升级版,弥补了之前文章的不足,对怎么写PRD,描述得更具体、更全面,是我思考的沉淀,也希望对大家有一定帮助。01. 你是否遇到过这样的问题PRD里关键需求描述不准确...

  • 关于功能需求设计文档的一些整理与思考

    引用内容摘自CharlieChu发布的博文 ·需要功能设计文档的原因 日常工作中,因为人员架构的原因,容易出现一种现象:领导或者产品经理口头描述一 件来自公司战略规划或者客户诉求的功能,要求程序员去实现对应的功能。 这种做法会在一定程度上加速当前项目的进度,对于小公司而言,能够按期交付已经是一大挑战,所以这样模棱两可的需求说明有一定概率能够缩短公司的研发周期,降低研发成本。 但是,这种做法的弊端显然易见:程序员存在一定概率对功能理解不充分,如果着手研发,此时大概率会出现实际研发产品功能和预想存在偏差。一般

  • 功能详细设计文档(参考模版)

    功能详细设计文档(参考模版)

  • 产品设计

    产品设计是一个由抽象的概念到具体形象化的处理过程,通过文字或图像等方式将我们规划的产品需求展现出来。它将产品的某种目的或需求转换为一个具体的物理或工具的过程,把一种计划、规划设想、问题解决的方法,通过具体的操作,以理想的形式表达出来。 由于产品设计阶段要全面确定整个产品策略、外观、结构、功能,从而确定整个产品系统的布局,因而,产品设计的意义重大,具有“牵一发而动全局”的重要意义。如果一个产品

  • 为什么需要功能需求设计说明书

    为什么需要功能需求设计说明书在没有功能设计文档时,主要有如下几个问题: 前期研究团队沟通成本如何要让团队里面的所有人员对软件产品的功能需求设计有一个共识?没有功能设计文档,反正我是想不出有什么办法。当该项目的团队人员越多,沟通成本就变得很高。 研发人员很容易有一个通病:以为自己了解了一小块需求就立即开始埋头狂撸……代码。最终很可能与项目经理和客户真正想要的功能相差甚远。更可怕的,研发人员把数据库设计

  • 功能详细设计文档模板

    这篇文章可作为方案设计文档参考,读者可根据需要自行修改格式。

  • 什么是软件需求?什么是功能需求?

    我们的软件产品或者项目,其需求都有三个层级和三个方面。 一、我们首先看需求的三个层次 软件需求包括3个不同的层次――业务需求、用户需求和功能需求。 业务需求 (Business requirement)表示组织或客户高层次的目标。业务需求通常来自项目投资人、购买产品的客户、实际用户的管理者...

  • 如何写软件的需求和设计文档

    编程快20年,写了一些的文档。之前也一直在思考如何写文档,这个过程中,有几次提升。一次是在华为,学习如何写设计文档。另外就是写需求文档,这次的项目,以前需求写得也比较多,但都是有足够的思间来慢慢写,这次时间比较紧张,所以,思考如何写作需求。==============================开始之前,我们还是先回下头,想想到底什么是软件。什么是硬件。这是因为,许多公司,特别是中国现阶段,实...

  • 需求分析文档模板

    目 录 1. 引言 1 1.1. 背景 1 1.2. 参考资料 1 1.3. 假定和约束 1 1.4. 用户的特点 1 2. 功能需求 1 2.1. 系统范围 1 2.2. 系统体系结构(二层架构的系统可剪裁本小节) 1 2.3. 系统总体流程 2 2.4. 需求分析 2 2.4.1. XXXXXXX(功能需求名称) 2 2.4.1.1. 功能描述 2 2.4.1.2.

  • 基于需求文档(PRD)的功能用例设计

    上一篇我讲了在项目运行过程中,用例是需要动态更新的。接下来我将结合实例(移动app)讲解在不同的阶段如何设计用例。 需求文档(PRD)主要讲述app的某个模块有什么功能,每一项功能的页面展示、页面操作有哪些,不同操作之间的关系是什么。基于PRD的用例设计是使用黑盒测试方法,而我平时主要使用了等价类划分、边界值分析法、状态转换测试、场景测试,操作实践时偏好于将模块分成页面展现、页面操作、接口、异常

  • Java Web 课程设计需求分析文档

    企业办公软件管理需求分析文档 一、引言 1.1编写目的:   软件需求分析是为了使用户和软件开发人员双方对该软件的初始规定有一个共同的理解,使之成为整个软件开发工作的基础.就本项目而言,编写需求分析报告的主要目的是明确系统各部分需要完成的功能,了解系统安全性等方面的特性,为下一步系统详细设计和开发,代码编写打下基础。 1.2项目背景:   本项目基于Java EE面向企业级的开发。用于本...

  • 用户界面的需求分析与设计原则

    一、引言用户界面是人与计算机之间的媒介。用户通过用户界面来与计算机进行信息交换。因此,用户界面的质量,直接关系到应用系统的性能能否充分发挥,能否使用户准确、高效、轻松、愉快地工作。所以软件的友好性、易用性对于软件系统至关重要。目前国内软件开发者在设计过程中很注重软件的开发技术及其具有的业务功能,而忽略了用户对用户界面的需求,影响软件的易用性、友好性。其实用户界面是一个应用程序很重要的一面——它

Global site tag (gtag.js) - Google Analytics