zoukankan      html  css  js  c++  java
  • Mysql读写锁保姆级图文教程

    摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。

    本文分享自华为云社区《Mysql保姆级读写锁图文教程丨【绽放吧!数据库】》,作者:Code皮皮虾 。

    准备

    创建mylock表
    CREATE TABLE `mylock` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    【手动增加表锁】 lock table 表名字1 read(write),表名字2 read(write),其它;
    【查看表上加过的锁】  show open tables; 
    【释放表锁】unlock tables;

    读锁

    读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。

    共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

    1.运行show open tables,可见In_use全为0即没有加过锁,为1表示有锁。

    2.运行lock table mylock read,lagou write加锁后,show open tables可见加锁成功。

    3.开启两个查询,在session1加读锁lock table mylock read

    都可查询成功。

    4.在session2读任何表都不会受影响

    5.在session1中查询其他表或更新表都不行。

    6.在session2中更新表,则会阻塞。

    写锁

    写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

    排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

    先unlock tables释放锁,再在session1运行lock table mylock write加写锁

    1.在session1中更新成功

    但查询失败

    2.在session2中查询会阻塞

    总结

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

    MYSQL的表级锁有两种模式:
    1.表共享读锁(Table Read Lock)
    2.表共享写锁(Table Write Lock)

    结论:

    1、对MyLSAM表的读操作(加读锁),不会阻塞其他线程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。

    2、对MyLSAM表的读操作(加读锁),会阻塞其他线程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

    简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    初识DJango框架
    web框架基础
    前端——JavaScript
    前端——css(下)
    前端——css(上)
    前端——html
    spring注解
    spring boot 详解(1)spring boot +mybatis+mysql+jsp
    spring 事务控制
    maven pom文件管理
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/15107862.html
Copyright © 2011-2022 走看看