「MySQL高级篇」MySQL锁机制 && 事务( 二 )



「MySQL高级篇」MySQL锁机制 && 事务

文章插图
写操作
  • 客户端①直接报错 , 因为读锁会排斥写操作
  • 客户端②陷入了阻塞状态,得等待客户端①释放锁

「MySQL高级篇」MySQL锁机制 && 事务

文章插图
  • unlock后,客户端②的写操作就能正常执行了 。

「MySQL高级篇」MySQL锁机制 && 事务

文章插图
总结
  • 读锁对于加锁的客户端:会限制对其他表的查询以及对任何表的写操作
  • 读锁对于其他客户端:不会限制任何查询 , 但会阻塞对该表的写操作
助记自己拿到了读锁 , 那自己当然不能再去读其他表 , 而又因为读锁不会影响到其他客户端读的结果,那其他客户端自然可以任意读 。
而对于写操作:自己还在读,就别想着去做写操作了!而对于其他客户端,如果对该表写操作 。肯定会影响到当前客户端的读取结果,所以其他客户端不能对该表进行写操作
  • 简而言之:自己不能三心二意【操作其他表】,而对他人则考虑自己所做的操作会不会导致两个客户端拿到不一致的数据,会的话就是不允许的 。
写锁案例客户端 一 :
1)获得tb_book 表的写锁
lock table tb_book write ;2)执行查询操作
select * from tb_book ;3)执行更新操作
update tb_book set name = 'java编程思想(第二版)' where id = 1;更新操作执行成功 ;
客户端二 :
4)执行查询操作
select * from tb_book ;
  • 陷入阻塞状态 , 因为写锁是排他锁,排斥其他客户端的写和读操作 。

「MySQL高级篇」MySQL锁机制 && 事务

文章插图
当在客户端一中释放锁指令 unlock tables 后,客户端二中的 select 语句 就会立即执行
总结
  • 写的优先级很高,对于锁定的表可写可读,但同样不能三心二意?。。《渌突Ф硕杂谒ǖ谋砩兑哺刹涣?/li>
结论锁模式的相互兼容性如表中所示:
「MySQL高级篇」MySQL锁机制 && 事务

文章插图
由上表可见:
1) 对MyISAM 表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞其他用户对同一表的写请求;
2) 对MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作;
此外,MyISAM 的读写锁调度是写优先,这也是MyISAM不适合做写为主的表的存储引擎的原因 。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞 。
查看锁的争用情况show open tables;
「MySQL高级篇」MySQL锁机制 && 事务

文章插图
In_user : 表当前被查询使用的次数 。如果该数为零 , 则表是打开的,但是当前没有被使用 。
Name_locked:表名称是否被锁定 。名称锁定用于取消表或对表进行重命名等操作 。
show status like 'Table_locks%';
「MySQL高级篇」MySQL锁机制 && 事务

文章插图
Table_locks_immediate : 指的是能够立即获得表级锁的次数 , 每立即获取锁,值加1 。
Table_locks_waited : 指的是不能立即获取表级锁而需要等待的次数,每等待一次 , 该值加1,此值高说明存在着较为严重的表级锁争用情况 。
InnoDB 行锁行锁介绍行锁特点 :偏向InnoDB 存储引擎,开销大 , 加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高 。
InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是采用了行级锁 。(两者是息息相关的)
事务事务及其ACID属性事务是由一组SQL语句组成的逻辑处理单元 。
事务具有以下4个特性,简称为事务ACID属性 。
ACID属性含义原子性(Atomicity)事务是一个原子操作单元 , 其对数据的修改,要么全部成功,要么全部失败 。一致性(Consistent)在事务开始和完成时 , 数据都必须保持一致状态 。隔离性(Isolation)数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的 “独立” 环境下运行 。持久性(Durable)事务完成之后,对于数据的修改是永久的 。并发事务处理带来的问题问题含义丢失更新(Lost Update)当两个或多个事务选择同一行 , 最初的事务修改的值,会被后提交的事务修改的值覆盖 。脏读(Dirty Reads)读到了另一个事务还未提交的数据不可重复读(Non-Repeatable Reads)一个事务执行同样的两次select语句,前后查询出来的结果不一致幻读(Phantom Reads)一个事务按照相同的查询条件重新读取以前查询过的数据,却发现其他事务插入了满足其查询条件的新数据 。幻读幻读:就像出现了“幻影”一般,原本查不到这个人,然后要插入的时候,突然又说这个人存在

推荐阅读