温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在php中操作mysql锁机制

发布时间:2021-05-06 15:47:11 来源:亿速云 阅读:372 作者:Leah 栏目:编程语言

今天就跟大家聊聊有关怎么在php中操作mysql锁机制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

php的框架有哪些

php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Phalcon是运行速度最快的一个PHP框架。3、Symfony,Symfony是一款为Web项目准备的PHP框架。4、Yii,Yii是一款快速、安全和专业的PHP框架。5、CodeIgniter,CodeIgniter是一款非常敏捷的开源PHP框架。6、CakePHP,CakePHP是一款老牌的PHP框架。7.Kohana,Kohana是一款敏捷但是功能强大的PHP框架。


1、MyISAM 表锁

MyISAM表级锁模式:

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

  • 表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作;

MyISAM加表锁方法:

  • 用 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/**
 */$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/**
 */$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中操作mysql锁机制有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI