讲师中心 微信公众号
AI工具推荐 视频效率加速

浅析php简单操作mysql锁机制

大敏大大_3315

大敏大大_3315

发布时间:2021-04-30 17:16:41

|

8675人浏览过

|

来源于CSDN

转载

浅析php简单操作mysql锁机制

锁机制
共享锁与排他锁
共享锁(读锁):其他事务可以读,但不能写。
排他锁(写锁) :其他事务不能读取,也不能写。

对于MySQL来说,有三种锁的级别:页级、表级、行级页级的典型代表引擎为BDB。行级的典型代表引擎为INNODB。表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。MyISAM 和 MEMORY 存储引擎采用的是表级锁

相关免费学习推荐:php编程(视频)

1、MyISAM 表锁

MyISAM表级锁模式:

  • 表共享读锁 (Table Read Lock):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
  • 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作;

MyISAM加表锁方法:

立即学习“PHP免费学习笔记(深入)”;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 用 LOCK TABLE 命令给 MyISAM 表显式加锁
  • LOCK TABLES real_table (READ|WRITE), insert_table (READ|WRITE); //加锁
  • UNLOCK TABLES; //解锁

列子:
比如有 account(id,name,cash),hero(number,name,country)这两张表

  1. lock tables account read; 将account加为只读锁
    当前进程查询:select * from hero;会报Table ‘hero’ was not locked with LOCK TABLES。
    当前进程更改其他表:update hero set name=“ss” where number=1; 会报Table ‘hero’ was not locked with LOCK TABLES
    当前进程更改表:update account set name=“ssss” where id=1;会报Table ‘account’ was locked with a READ lock and can’t be updated
    如果别mysql进程进来,可以查询其他表和account,但不能更改account,会一直等待,需要释放锁才执行

1.1PHP操作

<?php/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/29 0029
 * Time: 11:20
 */$link = new mysqli('127.0.0.1', 'root', '123', 'db_school'); // 连接数据库if(mysqli_connect_errno()){                                // 检查连接错误
    printf("连接失败:%s<br>", mysqli_connect_error());
    exit();}//(s1)$table = "account";$type = "read";$sql1 = "LOCK TABLES $table $type";$link->query($sql1);//处理逻辑//$sql1 = "select * from $table;";        //(s1)true//$sql1 = "select * from hero;";        //false//$sql1 = "update hero set name='ss' where number=1; ";     //false$sql1 = "update account set name='ssss' where id=1;";   //false$result = $link->query($sql1);var_dump($result);sleep(20);  //测试    //假设还没释放锁,开启cmd进mysql(s2)可以查询,但不能执行更改和删除操作,会等待这边释放锁$link->query("unlock tables");    //取消全部的锁//解锁后正常操作//$result = $link -> query($sql1);//var_dump($result);$link->close();

查询表级锁争用情况
show status like ‘Table%’;

  • Table_locks_immediate 指的是能够立即获得表级锁的次数
  • Table_locks_waited 指的是不能立即获取表级锁而需要等待的次数

2.InnoDB加锁方法:

对于普通 SELECT 语句,InnoDB 不会加任何锁;只能在事务执行过程中使用加锁
锁只有在执行commit或者rollback的时候才会释放,并且所有的锁都是在同一时刻被释放。

  • 共享锁(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE。其他 session 仍然可以查询记录,并也可以对该记录加 share mode 的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。大家都能读,但是不能改,只有其中一个独占共享锁时候才能改;
  • 排他锁(X):SELECT * FROM table_name WHERE … FOR UPDATE。其他 session 可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁。我要改,你们都不能改,也不能读
    #select … lock in share mode //共享锁
    #select … for update //排他锁
    ##在 MySQL 8.0 中
  • 共享锁(S):SELECT * FROM table_name WHERE … FOR SHARE
  • 排他锁(X):SELECT * FROM table_name WHERE … FOR UPDATE[NOWAIT|SKIP LOCKED]
    –NOWAIT:发现有锁等待后会立即返回错误,不用等待锁超时后报错。
    –SKIP LOCKED:跳过被锁定的行,直接更新其他行,但是这样要注意是否会造成更新结果不符合预期。

2.1PHP操作

<?php/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/29 0029
 * Time: 10:06
 */$link = new mysqli('127.0.0.1', 'root', '123', 'db_school'); // 连接数据库if(mysqli_connect_errno()){                                // 检查连接错误
    printf("连接失败:%s<br>", mysqli_connect_error());
    exit();}//案例1$id = 1; //明确指定主键,并且有此数据,row lock (行锁)//$id = -1;   //明确指定主键,若查无此数据,无lock (无锁)$link->autocommit(0);                   // 开始事务(s1)//FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。$sql = "select * from account where id=$id for update";$link->query($sql);/***
 * 此时其他mysql进程可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁。
 *///(s1)可以进行更改,和查询等操作//$sql1 = "update account set name='aaa' where id=$id;";  //进行更改//$sql1 = "select * from account where id=$id;";  //进行查询$sql1 = "delete from account where id=$id;";  //进行删除$result = $link -> query($sql1);var_dump($result);sleep(20); //测试    //假设还在事务处理中,开启cmd进mysql(s2)执行更改和删除操作,会等待这边释放锁$link->commit();$link->close();

查看正在被锁定的的表
show OPEN TABLES where In_use > 0;
SHOW PROCESSLIST显示哪些线程正在运行。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

80

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

80

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

40

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

60

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

280

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

160

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

140

2026.09.23

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

80

2026.09.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn