天天看点

第 7 章 数据库并行访问控制

这里主要讲述有关开发中遇到的数据库并行问题

背景

我们有一个order订单表,工作流如下

有多个岗位,每个岗位上有多个工作人员。需要实现相同岗位上的工作人员看到的订单不能重复,防止多人同时操作一个订单。

正常情况只要是多人一起打开订单页面就会显示上面的订单,并且每个人显示的内容都相同。

<a></a>

表 7.1. 工作流模拟

操作

订单审核员 A

订单审核员 B

显示未处理订单,这里模拟两个人同时点开页面的情景

首先查询出数据库中的前五条记录,然后更新为Pending状态,防止他人抢占订单。

select的时候会被行级所挂起,直到被commit后才能查询出新数据,这是显示的数据是剩下的后5条

处理订单,模拟两个人点击审批通过按钮是的情景

更新状态Pending到Processing

处理成功与失败的情况

处理Pending状态的订单,可能产生冲突,不用担心有行锁,防止重复处理。

有一种情况,用户查看了列表并未及时处理订单,就会有很多Pending状态的订单,这是需要有人处理这些订单,但查询Pending时,可能同一时刻有人在审批订单,我们通过排他锁避免重复处理。

上面以MySQL为例,每次都需要使用for update 查出要处理的订单,如果是PostgreSQL 可以使用update + returning 来返回修改的数据,更为方便。

原文出处:Netkiller 系列 手札

本文作者:陈景峯

转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。