阅读更多

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

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

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

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

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

  • 为什么功能需求设计文档这么重要

    为什么功能需求设计文档这么重要 一、总结 一句话总结:这种撸起袖子就开干的方式,看似简单高效,便于直接沟通,能够快速迭代。却不知,发现没有一份正规且实时更新的功能需求设计文档,会付出三四倍的代价来弥补。 研发人员很容易有一个通病:以为自己了解了一小块需求就立即开始埋头狂撸......代码。最终很可能与项目经理和客户真正想要的功能相差甚远。 1、程序员不删自己写的不需要的代码的原因是...

  • 功能详细设计文档模板

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

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

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

  • 项目开发流程 —— 需求文档和设计文档的区别

    需求文档是根据用户需求转化而来的技术实现需求,需要针对用户提出的产品目标进行细分,总结出具体的每一个功能点,再针对每一个功能点细分为各种不同的操作流程,对每一个操作流程进行技术化定义。也就是说,需求文档是站在用户的角度来描述软件需要实现的功能、各个模块和其重要性、以及业务流程等。而系统设计文档则是站在开发人员的角度来软件需要实现的功能、各个模块和其重要性、以及业务流程等。 ...

  • 需求分析文档模板

    目 录 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.

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

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

Global site tag (gtag.js) - Google Analytics