MYSQL中的锁:
语法 :
LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【锁表】
UNLOCK TABLES  【释放表】

Read:读锁|共享锁 : 所有的客户端只能读这个表不能写这个表
Write:写锁|排它锁: 所有当前锁定客户端可以操作这个表,其他客户端只能阻塞
注意:在锁表的过程中只能操作被锁定的表,如果要操作其他表,必须把所有要操作的表都锁定起来!

应用场景:
1. 高并发下单时,减库存量时要加锁
2. 高并发抢单、抢票时要使用

error_reporting(0);
mysql_connect('localhost','root','admin123');
mysql_select_db('test');# mysql 锁
mysql_query('LOCK TABLE a WRITE');// 只有一个客户端可以锁定表,其他客户端阻塞在这
$rs = mysql_query('SELECT id FROM a');
$id = mysql_result($rs, 0, 0);
if($id > 0)
{--$id;mysql_query('UPDATE a SET id='.$id);
}# mysql 解锁
mysql_query('UNLOCK TABLES');

PHP 文件锁:

bool flock ( int handle, int operation [, int &wouldblock] );
flock() 操作的 handle 必须是一个已经打开的文件指针。operation 可以是以下值之一:

  1. 要取得共享锁定(读取程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)
  2. 要取得独占锁定(写入程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)
  3. 要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)
  4. 如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)

建两个文件
(1) a.php

$file = "temp.txt";
$fp = fopen($file , 'w');
if(flock($fp , LOCK_EX)){    fwrite($fp , "abc\n");    sleep(10);    fwrite($fp , "123\n");    flock($fp , LOCK_UN);
}
fclose($fp);

(2) b.php

$file = "temp.txt";
$fp = fopen($file , 'r');
echo fread($fp , 100);
fclose($fp);   

运行 a.php 后,马上运行 b.php ,可以看到输出:
abc
等 a.php 运行完后运行 b.php ,可以看到输出:
abc
123
显然,当 a.php 写文件时数据太大,导致时间比较长时,这时 b.php 读取数据不完整

修改 b.php 为:

$file = "temp.txt";
$fp = fopen($file , 'r');
if(flock($fp , LOCK_EX)){    echo fread($fp , 100);    flock($fp , LOCK_UN);
} else{    echo "Lock file failed...\n";
}
fclose($fp); 

运行 a.php 后,马上运行 b.php ,可以发现 b.php 会等到 a.php 运行完成后(即 10 秒后)才显示:
abc
123
读取数据完整,但时间过长,他要等待写锁释放。

修改 b.php 为:

$file = "temp.txt";
$fp = fopen($file , 'r');
if(flock($fp , LOCK_SH | LOCK_NB)){    echo fread($fp , 100);    flock($fp , LOCK_UN);
} else{    echo "Lock file failed...\n";
}
fclose($fp);

运行 a.php 后,马上运行 b.php ,可以看到输出:
Lock file failed…
证明可以返回锁文件失败状态,而不是向上面一样要等很久。

结论:
建议作文件缓存时,选好相关的锁,不然可能导致读取数据不完整,或重复写入数据。
file_get_contents 好像选择不了锁,不知道他默认用的什么锁,反正和不锁得到的输出一样,是不完整的数据。
我是要做文件缓存,所以只需要知道是否有写锁存在即可,有的话就查数据库就可以了。

文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 
文件的锁一般这么使用:

$fp = fopen("filename", "a");
flock($fp, LOCK_SH) or die("lock error")
$str = fread($fp, 1024);
flock($fp, LOCK_UN);
fclose($fp); 

注意fwrite之后,文件立即就被更新了,而不是等fwrite然后fclose之后文件才会更新,这个可以通过在fwrite之后fclose之前读取这个文件进行检查

但是什么时候使用lock_ex什么时候使用lock_sh呢?

读的时候: 
如果不想出现dirty数据,那么最好使用lock_sh共享锁。可以考虑以下三种情况: 
1. 如果读的时候没有加共享锁,那么其他程序要写的话(不管这个写是加锁还是不加锁)都会立即写成功。如果正好读了一半,然后被其他程序给写了,那么读的后一半就有可能跟前一半对不上(前一半是修改前的,后一半是修改后的) 
2. 如果读的时候加上了共享锁(因为只是读,没有必要使用排他锁),这个时候,其他程序开始写,这个写程序没有使用锁,那么写程序会直接修改这个文件,也会导致前面一样的问题 
3. 最理想的情况是,读的时候加锁(lock_sh),写的时候也进行加锁(lock_ex),这样写程序会等着读程序完成之后才进行操作,而不会出现贸然操作的情况

写的时候: 
如果多个写程序不加锁同时对文件进行操作,那么最后的数据有可能一部分是a程序写的,一部分是b程序写的 
如果写的时候加锁了,这个时候有其他的程序来读,那么他会读到什么东西呢? 
1. 如果读程序没有申请共享锁,那么他会读到dirty的数据。比如写程序要写a,b,c三部分,写完a,这时候读读到的是a,继续写b,这时候读读到的是ab,然后写c,这时候读到的是abc. 
2. 如果读程序在之前申请了共享锁,那么读程序会等写程序将abc写完并释放锁之后才进行读。

转载于:https://www.cnblogs.com/5aiQ/p/9486214.html

MySQL锁机制和PHP锁机制相关推荐

  1. mysql三锁,mysql锁机制之表锁(三)

    顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作.表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划 ...

  2. mysql怎么加全局锁_MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)

    MySQL实验室 1.?MySQL 中并发和隔离控制机制 Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作.一 ...

  3. mysql查询更新时的锁表机制分析

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级. MyISAM和MEMORY存储引擎采用的是表级锁( ...

  4. mysql锁机制为何设计如此复杂_再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  5. Mysql的锁机制之表锁

    Mysql的锁机制之表锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU,RAM,I/O等)的争用外,数据也是一种供许多用户共享的资源,如何保证数据并发访 ...

  6. mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  7. MySQL 深潜 - MDL 锁的实现与获取机制

    简介:本文将介绍在 MDL 系统中常用的数据结构及含义,然后从实现角度讨论 MDL 的获取机制与死锁检测,最后分享在实践中如何监控 MDL 状态. 作者 | 泊歌 来源 | 阿里技术公众号 一 背景 ...

  8. MySQL锁机制,行锁jingran加在索引上

    锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制,应该都不陌生.?但在这之前我们先来看看并发控制,理清MVCC多版本并发控制和锁的关系,这也是之前我很迷惑的一个点 并发控制技术 在数据库中, ...

  9. mysql不可重复读是锁的表吗,Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)...

    . 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5000,汇入100,并提交数据库,工资变为5100, 随后 事务A发生异常,回滚了,恢复张三的工资为5000,这样就导致 ...

  10. mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析

    锁的引入 如果A有100元,同时对B.C转账,若处理是同时的,则此时同时读取A的余额为100元,在对两人转账后写回,A的余额不是0元而是50元.因此,为了防止这种现象的出现,要引入锁的概念,如只有在A ...

最新文章

  1. CTFshow 文件包含 web87
  2. java str2date,java date类与string类实例代码分享
  3. 关于iOS沙盒的目录结构和获取
  4. Linux简单命令收录(who,echo,date)【上】
  5. lombok在IntelliJ IDEA下的使用
  6. 从激活windows10家庭中文版到企业版再到开启Hyper-V
  7. (189)FPGA变量初始化方法reg
  8. 删除同样元素(线性表)
  9. ai人工智能软件_您应该了解的5家创新AI软件公司
  10. bxp中好用的的文章(合适编程的人)(转)
  11. 装linux系统为什么会黑屏_Ubuntu安装时出现黑屏问题的解决
  12. 计算机二级vb语言题库百度云,全国计算机二级考试VB语言考试试题
  13. 风之大陆 服务器不稳定,《风之大陆》手游官网——异世界奇幻冒险MMO手游
  14. 游泳池 (Standard IO)
  15. ubuntu 16.04.4 desktop版安装
  16. win10 vs2017 community 新版 systemc
  17. vue3 动态传值给子组件
  18. 操作系统——文件管理实验
  19. 百度无法爬取Github Pages静态网站解决方案
  20. 蓝牙助手android,蓝牙助手手机版

热门文章

  1. HDU 4228 Flooring Tiles 反素数的应用
  2. Android 开机自动启动服务
  3. tomcat - JVM 配置
  4. 关于mysql优化_MYSQL---关于MYSQL优化
  5. RBPsuite RNA-蛋白质结合位点预测工具使用指南
  6. 如何加快Vivado的编译速度
  7. matlab读取txt数据绘图(python命令行传参)
  8. tcc(tiny cc)的作者是谁,对tcc的特点做描述?
  9. android surfaceflinger 老罗,「Android」SurfaceFlinger分析
  10. java 下拉列表监听_javascript对下拉列表框(select)的操作