MySQL高级——MySql锁机制(表锁)

一、MySql表锁(偏读)特点

  • 偏向MyISAM存储引擎;
  • 开销小,加锁快;
  • 无死锁;
  • 锁定粒度大,发生锁冲突的概率最高,并发度最低。

二、建表SQL

  • 创建mylock表的SQL

    CREATE TABLE mylock (
      id INT(11) NOT NULL AUTO_INCREMENT,
      username VARCHAR(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MYISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
    
    INSERT INTO mylock(username) VALUES('a');
    INSERT INTO mylock(username) VALUES('b');
    INSERT INTO mylock(username) VALUES('c');
    INSERT INTO mylock(username) VALUES('d');
    INSERT INTO mylock(username) VALUES('e');
    

    在这里插入图片描述

  • 创建book表的SQL

    CREATE TABLE book (
      id INT(11) NOT NULL AUTO_INCREMENT,
      bookname VARCHAR(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MYISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
    
    INSERT INTO book(bookname) VALUES('java');
    INSERT INTO book(bookname) VALUES('c++');
    INSERT INTO book(bookname) VALUES('.net');
    INSERT INTO book(bookname) VALUES('python');
    INSERT INTO book(bookname) VALUES('vue');
    

    在这里插入图片描述

三、MySql手动增加表锁的案例分析

1、查看表是否加过的锁

SHOW OPEN TABLES;

在这里插入图片描述在这里插入图片描述

2、手动增加表锁语法

 lock table 表名字1 read(write),表名字2 read(write);

3、手动给mylock表增加读锁,book表增加写锁

lock table mylock read,book write;

在这里插入图片描述

4、再次查看表是否加过的锁

SHOW OPEN TABLES;

在这里插入图片描述在这里插入图片描述

四、MySql手动释放表锁的案例分析

1、手动释放表锁语法

unlock tables;

2、释放给表增加的锁

unlock tables;

在这里插入图片描述
3、再次查看表是否加过的锁

SHOW OPEN TABLES;

在这里插入图片描述在这里插入图片描述

五、MySql手动增加表的(读锁)案例分析

1、在(客户端1)中,手动增加mylock表的读锁

lock table mylock read;

在这里插入图片描述
2、在(客户端2)中是否能查询到(客户端1)中上锁的mylock表数据。如下图:
在这里插入图片描述

  • 结论:(客户端1)中手动增加mylock表的读锁,(客户端1)能查看到mylock表的数据,(客户端2)也能查看到mylock表的数据。

3、在(客户端1)中,是否能手动修改mylock表的数据,如下图:
在这里插入图片描述

  • 结论:(客户端1)中手动修改mylock表的数据,会提示mylock表增加了表的读锁,因此不能被修改。

4、在(客户端1)中,是否能查询除mylock表以外的其他表数据,如下图:
在这里插入图片描述

  • 结论:(客户端1)中不能查询除mylock表以外的其他表数据。

5、在(客户端2)中,是否能修改(客户端1)锁定的mylock表数据如下图:
在这里插入图片描述

  • 结论:(客户端2)中,不能修改(客户端1)锁定的mylock表数据,会一直等待获得锁。

6、在(客户端1)中,释放mylock表锁,然后查看(客户端2)中,修改的数据耗时。如下图:
在这里插入图片描述

六、MySql手动增加表的(写锁)案例分析

1、在(客户端1)中,手动增加mylock表的写锁

LOCK TABLE mylock WRITE;

在这里插入图片描述
2、在(客户端1)中,是否能修改mylock表的数据。

在这里插入图片描述

  • 结论:(客户端1)中,能修改(客户端1)锁定的mylock表数据。

3、在(客户端1)中,是否能查询其他表(即book表)的数据。

在这里插入图片描述

  • 结论:(客户端1)中,不能查询(客户端1)锁定的mylock表数据。

4、在(客户端2)中,是否查询mylock表的数据。
在这里插入图片描述

  • 结论:(客户端2)中,不能查询(客户端1)锁定的mylock表数据。会一直等待获取mylock表的锁。

4、在(客户端1)释放锁之后,(客户端2)是否可以查询到mylock表的数据。
在这里插入图片描述

  • 结论:(客户端1)释放锁之后,(客户端2)可以查询到mylock表的数据。

七、MySql锁机制(表锁)的案例总结

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

1、MySQL的表级锁有两种模式

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)
锁类型是否兼容读锁写锁
读锁
写锁

2、结论

  • 对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
  • 对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
  • 简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞。

八、 MySql表锁分析

1、查看哪些表被加锁的命令

show open tables;

2、如何分析表锁定

  • 可以通过检查table_locks_waited 和table_locks_immediate状态变量来分析系统上的表锁锁定;
  • 命令 show status like ‘table%’;
    在这里插入图片描述
  • 这里有两个状态变量记录Mysql内部表级锁定的情况,两个变量说明如下:
  • Table_locks_immediate :产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1。
  • Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况。
  • 此外,Myisam的读写锁调用度是写优先,这也是myisam不合适做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量更新会使查询很难得到锁,从而造成永远阻塞。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL中存在三种级别的锁:行级锁、表级锁和页级锁。 1. 行级锁:MySQL的默认隔离级别是可重复读,支持行级锁。行级锁是最细粒度的锁,它可以在数据库中的单个行上进行操作。当一个事务占用了某行的行级锁时,其他事务无法修改该行。这提供了更好的并发性能,但也可能导致锁冲突和死锁。 2. 表级锁:表级锁是最粗粒度的锁,它可以在整个表上进行操作。当一个事务占用了某个表的表级锁时,其他事务无法修改该表中的任何数据。表级锁适用于只读操作或对整个表进行修改的情况,但会限制并发性能。 3. 页级锁:页级锁介于行级锁和表级锁之间,它以页为单位进行锁定。一个页通常包含多行数据。当一个事务占用了某页的页级锁时,其他事务无法修改该页中的任何数据。页级锁在某些情况下可以提供更好的并发性能,但在高并发环境下可能导致锁冲突。 选择何种锁取决于具体的业务需求和并发访问模式。通常情况下,行级锁是最常用的锁级别,可以提供较好的并发性能和数据完整性。如果只涉及到只读操作或对整个表进行修改,可以考虑使用表级锁。而页级锁在某些特定场景下可能有一定的应用价值。 需要注意的是,锁的使用需要谨慎,合理选择锁级别以避免死锁、锁冲突和性能问题。另外,MySQL还支持其他类型的锁,如意向锁和自适应锁等,在实际使用中需要根据具体情况进行选择和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值