mysql锁机制 php_MySQL锁机制&&PHP锁机制,应用在哪些场景中呢?

正文内容

模拟准备--如何模拟高并发访问一个脚本:apache安装文件的bin/ab.exe可以模拟并发量

-c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本

C:\phpStudy\Apache\bin>ab.exe -c 10 -n 10 http://localhost/try.php

MYSQL中的锁:

语法 :

LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【锁表】

UNLOCK TABLES  【释放表】

Read:读锁|共享锁 : 所有的客户端只能读这个表不能写这个表

Write:写锁|排它锁: 所有当前锁定客户端可以操作这个表,其他客户端只能阻塞

注意:在锁表的过程中只能操作被锁定的表,如果要操作其他表,必须把所有要操作的表都锁定起来!

PHP中的文件锁 (锁的是文件,不是表)

文件锁的文件与表有什么关系?:一点关系也没有,与令牌相似,谁拿到谁操作。所以表根本没锁。

测试时,有个文件就行,叫什么名无所谓

总结:

项目中应该只使用PHP中的文件锁,尽量避免锁表,因为如果表被锁定了,那么整个网站中所有和这个表相关的功能都被拖慢了(例如:前台很多用户一直下订单,商品表mysql锁表,其他与商品表相关的操作一直处于阻塞状态【读不出来商品表】,因为一个功能把整个网站速度拖慢)。

比如在一个O2O外卖项目中,中午12-2点,晚上6点都是订单高并发时,这种情况下,MySQL锁显然是不考虑的,用户体验太差。其实根据实际的需求,外卖可以不用设计库存量的,当然除了秒杀活动模块还是需要php文件锁的。

应用场景:

1. 高并发下单时,减库存量时要加锁

2. 高并发抢单、抢票时要使用

MySQL锁示例代码:

/*

模拟秒杀活动-- 商品100件

CREATE TABLE ta

(

id int comment '模拟100件活动商品的数量'

);

INSERT INTO ta VALUES(100);

模仿:以10的并发量访问这个脚本! 使用apache自带的ab.exe软件

*/

// 关闭错误报告

error_reporting(0);

$dbhost = 'localhost:3306'; // mysql服务器主机地址

$dbuser = 'root'; // mysql用户名

$dbpass = 'root'; // mysql用户名密码

$conn = mysqli_connect($dbhost, $dbuser, $dbpass);

if(! $conn )

{

die('连接失败: ' . mysqli_error($conn));

}

// 设置编码,防止中文乱码

mysqli_query($conn , "set names utf8");

mysqli_select_db( $conn, 'temp' );

# mysql 锁

mysqli_query($conn , 'LOCK TABLE a WRITE');// 只有一个客户端可以锁定表,其他客户端阻塞在这

$rs = mysqli_query($conn , 'SELECT id FROM a');

$id = mysqli_result($rs, 0, 0);

if($id > 0)

{

--$id;

mysqli_query($conn , 'UPDATE a SET id='.$id);

}

# mysql 解锁

mysqli_query($conn , 'UNLOCK TABLES');

//查询解锁后的id值

// $res = mysqli_query($conn , 'SELECT id FROM ta');

// while($row = mysqli_fetch_assoc($res))

// {

// $id = $row['id'];

// }

// echo $id;

PHP文件锁示例代码:

/*

模拟秒杀活动-- 商品100件

CREATE TABLE ta

(

id int comment '模拟100件活动商品的数量'

);

INSERT INTO ta VALUES(100);

模仿:以10的并发量访问这个脚本! 使用apache自带的ab.exe软件

*/

// 关闭错误报告

error_reporting(0);

$dbhost = 'localhost:3306'; // mysql服务器主机地址

$dbuser = 'root'; // mysql用户名

$dbpass = 'root'; // mysql用户名密码

$conn = mysqli_connect($dbhost, $dbuser, $dbpass);

if(! $conn )

{

die('连接失败: ' . mysqli_error($conn));

}

// 设置编码,防止中文乱码

mysqli_query($conn , "set names utf8");

mysqli_select_db( $conn, 'temp' );

# php中的文件锁

$fp = fopen('./a.lock', 'r'); // php的文件锁和表没关系,随便一个文件即可

flock($fp, LOCK_EX);// 排他锁

$retval = mysqli_query($conn ,'SELECT id FROM ta');

while($row = mysqli_fetch_assoc($retval))

{

$id = $row['id'];

}

if($id > 0)

{

--$id;

mysqli_query($conn ,'UPDATE ta SET id='.$id);

}

# php的文件锁,释放锁

flock($fp, LOCK_UN);

fclose($fp);

// $res = mysqli_query($conn , 'SELECT id FROM ta');

// while($row = mysqli_fetch_assoc($res))

// {

// $id = $row['id'];

// }

// echo $id;

文章来自于:博客

链接:http://www.cnblogs.com/foxy/p/9204892.html

【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

Mysql锁机制--乐观锁 & 悲观锁

Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...

Mysql锁机制--索引失效导致行锁变表锁

Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...

MySQL性能调优——锁定机制与锁优化分析

针对多线程的并发访问,任何一个数据库都有其锁定机制,它的优劣直接关系着数据的一致完整性与数据库系统的高并发处理性能.锁定机制也因此成了各种数据库的核心技术之一.不同数据库存储引擎的锁定机制是不同的,本 ...

mysql优化二之锁机制

mysql优化二之锁机制 mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制, MVCC见下篇文章 mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁 ...

[转]MySQL 表锁和行锁机制

本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...

MySql(七):MySQL性能调优——锁定机制与锁优化分析

针对多线程的并发访问,任何一个数据库都有其锁定机制,它的优劣直接关系着数据的一致完整性与数据库系统的高并发处理性能.锁定机制也因此成了各种数据库的核心技术之一.不同数据库存储引擎的锁定机制是不同的,本 ...

mysql锁机制之间隙锁(Next-Key锁)(五)

间隙锁(Next-Key锁) 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的 索引项加锁:对于键值在条件范围内但并不存在的记录,叫做“间隙(GA ...

Mysql存储引擎以及锁机制

一.常用命令 1.查看引擎(默认为InnoDB) 查看mysql提供的存储引擎:show engienes 查看mysql当前默认的存储引擎:show variables like '%storage ...

mysql的锁机制,以及乐观锁,悲观锁,以及热点账户余额问题

mysql的简单锁机制. myisam 1.只支持表级锁,所以经常更新的表结构不适宜用. 2.select也会产生锁表 innodb 1.支持事务,行级锁,表级锁,执行行级锁的前提是sql语句的索引有 ...

随机推荐

zju(1)嵌入式开发环境构建

1. 实验目的 搭建嵌入式开发环境,安装ubntu,编译交叉工具链,安装配置tftp,nfs.用makefile 编译几个文件,在实验台上运行. 2. 实验内容 1) 安装ubuntu12.04 2) ...

bzoj1799

这是一道比较难的数位dp 因为逐位统计好像无法处理数位和整除原数的 但是有了刚才的bzoj1072的经验,我们能做的是逐位处理被一个数d整除的方案 不难想到先穷举数位和now,now最大也就162,可 ...

IOS开发中绘制地图线路

地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用 MKOverlayView进行线路的绘制. 使用MKMapView添加MKMap.framework 和Cor ...

canvas-8searchLight3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值