美文网首页
mysql锁机制

mysql锁机制

作者: 一曲三月 | 来源:发表于2021-09-05 22:52 被阅读0次

    1,数据库锁理论概述
    分类: 读锁、写锁。
    行锁,表锁,页锁。
    1.1 表锁:无死锁,加锁快
    加锁:lock tables 表名 read(write)
    释放锁: unlock tables;
    查看锁: show open tables
    读锁 -》共享锁 1,自己可以读,2,别人可以读 3,不可以更新 4,不可以读其他表
    写锁-》独占锁 1,自己可以读,2,别人不可以读,不可以更新 3,可以更新 4,不可以读其他表
    myisam 在执行select 之前,会自动给涉及的表加读锁,在执行增删改之前,会自动给涉及的表加写锁。
    分析表锁:
    通过 table_locks_waited和table_locks_immediate变量分析表锁定
    查看 show status like '%table%'
    table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加一。
    table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次值加一),此值高则说明存在着严重的表级锁争用情况。
    另外,myisam读写锁调度是写优先,这也是myisam不适合做写为主表的引擎的原因。因为写锁后,其他线程不能做任何操作,大量查询会使查询很难得到锁,从而造成永久阻塞。
    1.2 行锁
    偏向Innodb存储引擎,开销大,加锁慢,会出现死锁。锁定粒度最小,发生所冲突的概率最低,并发度最高。
    Innodb与myISAm的最大不同有两点:1,支持事务 2,采用行级锁
    语法: 1,通过索引项加锁 2,通过select **** for update加锁 ,锁定某一行后,其他操作会被阻塞,知道锁定行的会话commit。
    InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
    1)InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁
    2)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁
    3)有了索引以后,在对索引字段查询时,使用的就是行级锁,如果是使用相同的索引键值,是会出现锁冲突的
    4)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行
    1.3 间隙锁
    当我们用范围条件而不是相等条件检索数据(并请求共享或排他锁时),InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)
    分析行锁:
    查看 show status like 'innodb_row_lock%'
    innodb_row_lock_current_waits 当前正在等待锁定的数量
    innodb_row_lock_time 从系统启动到现在锁定总时间长度
    innodb_row_lock_time_avg 每次等待所花费平均时间
    innodb_row_lock_time_max 从系统启动到现在等待最长的一次花费的时间
    innodb_row_lock_waits 从系统启动到现在总共等待的次数

    相关文章

      网友评论

          本文标题:mysql锁机制

          本文链接:https://www.haomeiwen.com/subject/syeswltx.html