mysql 更新锁_mysql锁是怎么实现的

mysql 更新锁_mysql锁是怎么实现的利用Mysql的锁来解决高并发的问题,先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL…

更新库存时,你是如何用mysql锁解决高并发问题的

mysql 更新锁_mysql锁是怎么实现的

 

利用Mysql的锁来解决高并发的问题,先看没有利用事务的时候并发的后果

创建库存管理表

CREATE TABLE `storage` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `number` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

代码100分

创建订单管理表

代码100分CREATE TABLE `order` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `number` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=latin1

测试代码

$pdo = new PDO("mysql:host=127.0.0.1;port=3306; dbname=test","root","123456");
$sql="select `number` from storage where id=1 limit 1";
$res = $pdo->query($sql)->fetch();
$number = $res["number"];

if($number>0)
{
  $sql ="insert into `order` VALUES (null,$number)";

  $order_id = $pdo->query($sql);
  if($order_id)
  {

    $sql="update storage set `number`=`number`-1 WHERE id=1";
    $pdo->query($sql);
  }
}

我们预置库存是十个,然后执行ab测试查看结果

代码100分mysql> select * from storage
  -> ;
+----+--------+
| id | number |
+----+--------+
| 1 |   -2 |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from `order`;
+----+--------+
| id | number |
+----+--------+
| 22 |   10 |
| 23 |   10 |
| 24 |   8 |
| 25 |   8 |
| 26 |   7 |
| 27 |   6 |
| 28 |   4 |
| 29 |   3 |
| 30 |   2 |
| 31 |   2 |
| 32 |   2 |
| 33 |   1 |
+----+--------+
12 rows in set (0.00 sec)

得到了订单共有12个,而库存表的库存也减到了-2,这显然不符合实际逻辑的;

下面我们来看利用数据库行锁来解决这个问题

修改代码如下

$pdo = new PDO("mysql:host=127.0.0.1;port=3306; dbname=test","root","123456");
$pdo->beginTransaction();//开启事务
$sql="select `number` from storage where id=1 for UPDATE ";//利用for update 开启行锁
$res = $pdo->query($sql)->fetch();
$number = $res["number"];

if($number>0)
{
  $sql ="insert into `order` VALUES (null,$number)";

  $order_id = $pdo->query($sql);
  if($order_id)
  {

    $sql="update storage set `number`=`number`-1 WHERE id=1";
    if($pdo->query($sql))
    {
      $pdo->commit();//提交事务
    }
    else
    {
      $pdo->rollBack();//回滚
    }

  }
  else
  {
    $pdo->rollBack();//回滚
  }
}

查看结果

mysql> select * from storage;
+----+--------+
| id | number |
+----+--------+
| 1 |   0 |
+----+------
--+
1 row in set (0.00 sec)

mysql> select * from `order`;
+----+--------+
| id | number |
+----+--------+
| 1 |   10 |
| 2 |   9 |
| 3 |   8 |
| 4 |   7 |
| 5 |   6 |
| 6 |   5 |
| 7 |   4 |
| 8 |   3 |
| 9 |   2 |
| 10 |   1 |
+----+--------+
10 rows in set (0.00 sec)

很明显在利用了mysql锁之后,对库存进行了有效的控制,很好的解决了第一段代码里面,因为并发引起的一些逻辑性的问题。

 

mysql 更新锁_mysql锁是怎么实现的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7567.html

(0)
上一篇 2023-03-18
下一篇 2023-03-18

相关推荐

  • 在线运行Python代码

    在线运行Python代码下面是一个使用repl.it的Python代码示例:

    2024-06-17
    51
  • Python中的append方法:添加元素到列表

    Python中的append方法:添加元素到列表Python中的列表是一种可变的有序序列,可以为列表添加、删除、修改元素。在Python中,要向列表添加元素,可以使用append方法。append方法用于在列表的末尾添加一个元素。这个方法会改变列表,而且只会添加元素一个,也就是说,当我们执行append方法时,只需指定添加的元素即可,不用考虑位置。

    2024-03-08
    88
  • MySQL家族”新”成员——MySQL Shell[通俗易懂]

    MySQL家族”新”成员——MySQL Shell[通俗易懂]本文转载自“MySQL解决方案工程师”公众号,由徐轶韬翻译 标题虽然叫做MySQL家族新成员,但如果从发布时间上来看,MySQL Shell已经不能算做新成员了,它的正式版与MySQL8.0同一天诞…

    2023-01-27
    149
  • Python实现的索引查找功能

    Python实现的索引查找功能索引查找是一种快速查找数据的算法,它可以在大数据集合中快速地定位到目标数据的位置。索引是数据的引用,也可以看做是数据的指针。利用索引可以减少查找的时间复杂度,提高数据的检索效率。

    2023-12-07
    124
  • 详解redis网络IO模型「终于解决」

    详解redis网络IO模型「终于解决」前言 "redis是单线程的" 这句话我们耳熟能详。但它有一定的前提,redis整个服务不可能只用到一个线程完成所有工作,它还有持久化、key过期删除、集群管理等其它模块,redi

    2023-06-19
    143
  • mongodb命令行操作_DOS命令

    mongodb命令行操作_DOS命令客户端工具Studio3T 一. 概述 &下载 studio3t是mongodb优秀的客户端工具。 可以更方便的操作mongodb 命令 官方地址 : https://studio3t.com/ 当…

    2023-03-11
    150
  • openjdk安装_openeuler centos

    openjdk安装_openeuler centosOpenEuler安装配置PostgreSQL 编写时间:2021年9月18日 作者:liupp 邮箱:liupp@88.com 序号 更新内容 更新日期 更新人 1 完成第一至三章内容编辑; 202

    2023-04-22
    150
  • OLAP引擎:基于Presto组件进行跨数据源分析

    OLAP引擎:基于Presto组件进行跨数据源分析Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节,Presto虽然具备解析SQL的能力,但它并不属于标准的数据库范畴。

    2023-04-13
    166

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注