博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库并行访问控制之互斥显示
阅读量:5952 次
发布时间:2019-06-19

本文共 3189 字,大约阅读时间需要 10 分钟。

Netkiller MySQL 手札

MySQL MariaDB...

MrNeo Chan陈景峰(BG7NYT)

中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890
+86 755 29812080

文档始创于2010-11-18

版权 © 2011, 2012, 2013 Netkiller(Neo Chan). All rights reserved.

版权声明

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

文档出处:

 

$Date: 2013-04-10 15:03:49 +0800 (Wed, 10 Apr 2013) $

我的系列文档

 

 

 

 

 

 

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

 

目录

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

9.1. 防止并行显示

 
id | user | sn    | status-----------------------------------1  | neo  | x001  | new2  | jam  | x002  | new3  | sam  | x003  | new4  | tom  | x004  | new5  | ann  | x005  | new6  | leo  | x006  | new7  | ant  | x007  | new8  | cat  | x008  | new

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

CREATE TABLE `orders` (	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,	`name` VARCHAR(50) NOT NULL,	`sn` INT(10) UNSIGNED ZEROFILL NOT NULL,	`status` ENUM('New','Pending','Processing','Success','Failure') NOT NULL DEFAULT 'New',	PRIMARY KEY (`id`),	UNIQUE INDEX `sn` (`sn`))COMMENT='订货单'COLLATE='utf8_general_ci'ENGINE=InnoDB
INSERT INTO `orders` (`id`, `name`, `sn`, `status`) VALUES	(1, 'neo', 0000000001, 'New'),	(2, 'jam', 0000000002, 'New'),	(3, 'sam', 0000000003, 'New'),	(4, 'tom', 0000000004, 'New'),	(5, 'ann', 0000000005, 'New'),	(6, 'leo', 0000000006, 'New'),	(7, 'ant', 0000000007, 'New'),	(8, 'cat', 0000000008, 'New');

表 9.1. 工作流模拟

操作 订单审核员 A 订单审核员 B
显示未处理订单,这里模拟两个人同时点开页面的情景
begin;select id from orders where status='New' limit 5 for update;update orders set status='Pending' where status='New' and id in (1,2,3,4,5);select * from orders where status='Pending' and id in (1,2,3,4,5) order by id asc limit 5;commit;

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

begin;select id from orders where status='New' limit 5 for update;update orders set status='Pending' where status='New' and id in (6,7,8);select * from orders where status='Pending' and id in (6,7,8) order by id asc limit 5;commit;

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

处理订单,模拟两个人点击审批通过按钮是的情景
begin;							select * from orders where status='Pending' and id='1' for update;update orders set status='Processing' where status='Pending' and id=1;commit;

更新状态Pending到Processing

begin;							select * from orders where status='Pending' and id='6' for update;update orders set status='Processing' where status='Pending' and id=6;commit;

更新状态Pending到Processing

处理成功与失败的情况
begin;							select * from orders where status='Processing' and id='1' for update;update orders set status='Success' where status='Processing' and id=1;commit;
begin;							select * from orders where status='Processing' and id='6' for update;update orders set status='Failure' where status='Processing' and id=6;commit;
处理Pending状态的订单,可能产生冲突,不用担心有行锁,防止重复处理。
begin;							select * from orders where status='Processing' and id='5' for update;update orders set status='Failure' where status='Processing' and id=5;commit;
begin;							select * from orders where status='Processing' and id='5' for update;update orders set status='Failure' where status='Processing' and id=5;commit;

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

你可能感兴趣的文章
一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...
查看>>
[转]Newtonsoft.Json高级用法
查看>>
Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍
查看>>
DFI、DPI技术
查看>>
hibernate 执行存储过程 方法
查看>>
RapidIOIP核的验证方法研究_王玉欢
查看>>
崩溃日志的实例
查看>>
base64是啥原理
查看>>
字符串中去除连续相同的字符保留一个
查看>>
实战 Windows Server 2012 群集共享卷
查看>>
CSS 元素超出部分滚动, 并隐藏滚动条
查看>>
React中那些纠结你的地方(一)
查看>>
Docker入门安装教程
查看>>
PhoneGap极光推送 cordova消息推送
查看>>
Subarray Sum Equals K
查看>>
preventDefault, stopPropagation, stopImmediatePropagation 三者的区别
查看>>
算法题解:找出包含给定字符的最小窗口(枚举的一般方法)
查看>>
超级账本HyperLedger初体验
查看>>
完美解决html中select的option不能隐藏的问题。
查看>>
推荐5大开源工具,用于开发Kubernetes项目
查看>>