关系型数据库如何处理“库存”问题

在商城中,有一件商品有100件库存,那么用户每购买一件,库存要做减一。 刚开始我想到这样进行处理:

$model = new Model();

//读取商品的库存
$quantity = $model->where(" id = 1 ")->count();

//库存减一
$quantity--;

$result = mysql_query("UPDATE goods SET quantity = $quantity WHERE id = 1 ");

这样的方式,在不考虑并发的情况下是没问题的,但如果有多个用户同时操作,情况就不一样了。

假设两个用户同时购买,A用户读取库存为10,B用户读取库存也是10,A购买完成后,将库存减一,改为9, 而此时,B也将库存减一,改为9。实际卖出了两件,但库存没有正确减少,就会造成“超卖”。

A、B用户的购买流程是交叉执行的。

问题的关键在于上面的代码使用了两条SQL语句,所以造成了不同用户的请求可能交叉执行。 如果能将操作合并到一条SQL语句中,就可以避免这个问题。

请看修改后的代码:

$model = new Model();

$result = mysql_query("UPDATE goods SET quantity = quantity - 1 WHERE id = 1 ");

由于关系型数据库都是存储在文件中,对同一条记录的修改不能同时进行。这意味着即使A、B用户同时购买,修改库存时也是按先后顺序来的,因此库存可以正确的减少。

还有一个问题,如果库存已经为0了,上面的代码就有问题了,因为没有检查库存。

有两种方法解决该问题:

1、将quantity字段设为unsigned,当库存为0时,因为字段不能为负数,将会返回false。

2、修改SQL语句和实现代码:

$model = new Model();

//读取商品的库存
$quantity = $model->where(" id = 1 ")->count();

//库存减一
$quantity--;

$result = mysql_query("UPDATE goods SET quantity = quantity - 1 WHERE id = 1 WHERE quantity > 0 ");
$num = mysql_affected_rows();

if($num == 1){
	//成功
}

如果库存为0了,受影响的行将为0,意味着购买失败。

时间: 2024-10-07 01:26:37

关系型数据库如何处理“库存”问题的相关文章

mysql基本认识【关系型数据库和nosql、mysql操作流程和体系,库操作,表操作,数据的操作,字符集的操作,以及php作为client操作数据库】对连接本身没有疑问

1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间[使用内存空间临时保存] 关系型数据库:利用二者的关系来描述实体的信息.[利用二维表字段名和字段值来进行描述][关系型数据库根本不是可以使用外键将两个表构建成关联的意思,而是实现描述实体的二维表的形式] nosql:not only sql[sql表示操作关系型数据的语言]所以nosql指的就是非关系型数据库[典型的是键值对型的数据(redis.memcache)][nosql可以视情况添加信息,不需要对

关系型数据库与NoSQL的对比

SQL(结构化的查询语言)数据库是过去四十年间存储数据的主要方式.20世纪90年代末随着Web应用和MySQL.PostgreSQL和SQLite等开源数据库的兴起,用户爆炸式的增长. NoSQL数据库自从20世纪60年代就已经存在了,直到MongoDB, CouchDB, Redis 和 Apache Cassandra等数据库的流行才获取了更多的关注. 你可以很容易地找到许多关于如何使用一款特定的SQL或NoSQL的教程,但是很少有讨论你为什么优先的使用一款而不适用另一款.我希望我能够填补这

关系型数据库基本概念及MySQL简述

数据库基本概念">关系型数据库基本概念 数据库: 对大量信息进行管理的高效解决方案. 按照数据结构来组织.存储和管理数据的库. 数据库系统(DBS,DATABASE SYSTEM): 数据库(DB,DATABASE) + 数据库管理系统(DBMS,DATABASE MANAGEMENT SYSTEM) 关系型数据库 建立在关系模型上的数据库系统. 关系模型: 将日常生活中的实体(学生)和实体的属性(学生的学号,姓名等)保存到数据库中时,应该如何处理该实体结构. 1.数据结构可以规定,同类数

linux下关系型数据库解释及mysql基本命令详解

1.RDBMS:关系型数据库,如下功能: 数据库创建.删除.修改 创建表.删除表.修改表 索引的创建.删除 用户和权限创建.修改.删除 数据新增.删除.修改 查询 2.myslq属于关系型数据库,数据引擎命令如下:命令不区分大小写 DML:Data Manapulate Language: 数据操作语言 INSERT, REPLACE, UPDATE, DELETE DDL:Data Defination Lanuage: 数据定义语言 CREATE, ALTER, DROP DCL:Data

关系型数据库进阶(三)连接运算及查询实例

上篇文字,我们知道如何获取数据了,那现在就把它们联接起来! 我要展现的是3个个常用联接运算符:合并联接(Merge join),哈希联接(Hash Join)和嵌套循环联接(Nested Loop Join).但是在此之前,我需要引入新词汇了:内关系和外关系(inner relation and outer relation). 一个关系可以是: 一个表 一个索引 上一个运算的中间结果(比如上一个联接运算的结果). 当你联接两个关系时,联接算法对两个关系的处理是不同的.在本文剩余部分,我将假定:

mongoDB关系型数据库的对比

一.基本操作 1.mongoDB和关系型数据库对比 对比项 mongoDB mysql oracle 表 集合list 二维表 表的一行数据 文档document 一条记录 表字段 键key 字段field 字段值 值value 值value 主外键 无 PK,FK 灵活度扩展性 极高 差 (1)关系型数据表的record必须保证拥有每一个field (2)mongoDB的每一个document的key可以不一样 (3)关系型数据查询使用sql (4)mongoDB查询使用内置的find函数--

ES 译文之如何使用 Logstash 实现关系型数据库与 ElasticSearch 之间的数据同

译者前言近期的主要工作是在为公司的 APP 增加搜索功能.因为也遇到了需要把关系型数据库中的数据同步 ElasticSearch 中的问题,故抽了点时间翻译了这篇官方的博文.最近,在数据同步方面也有些思考.本篇文章的重点不在 Logstash 的 JDBC 插件的使用方法,而是数据同步会遇到的一些细节问题如何处理.我觉得,这些设计思想是通用的,无论你使用的何种方式进行数据同步.翻译正文 为了利用 ElasticSearch 强大的搜索能力,大部分的业务都会在关系型数据库的基础上部署 Elasti

形象了解关系型数据库三大范式

接下来就对每一级范式进行一下解释,首先是第一范式(1NF).符合1NF的关系(你可以理解为数据表."关系"和"关系模式"的区别,类似于面向对象程序设计中"类"与"对象"的区别."关系"是"关系模式"的一个实例,你可以把"关系"理解为一张带数据的表,而"关系模式"是这张数据表的表结构.1NF的定义为:符合1NF的关系中的每个属性都不可再分.表1所示的

关系型数据库和文档型数据库的比较

关系型数据库 比较 nosql和关系型数据库比较? 关系型数据库与NOSQL数据库的区别 10个出色的NoSQL数据库 15个nosql数据库 走近NoSQL数据库的四大家族 深度解读