读锁  :共享锁

    写锁 : 排他锁
    锁分为读锁和写锁,简单理解:对某一行数据加了读锁,其他的人可一来读这一条数据,而不能来更新这条数据,如果加了写锁,其他人既不能更新,也不能读取

    但是 两种锁都不能对 select  语句进行阻止,也就是说select  语句游离在锁之外

    普通的 select  语句不会加任何锁,  

    select  。。。。。。。。。。。。。 lock in share mode 会加上S锁

 

    

    隔离性不同的时候,事务之间的锁的影响也是不一样的

    读已提交   Read  Commited  隔离性下

    1.事务A 查询主键并且上X锁写锁,,事务B再次查询相同的条件并且上X锁写锁的时候,事务B会阻塞,但是查询其他的条件并不会阻塞

 

 

    2.事务A查询唯一索引的时候于上面主键的效果是一样的

    3.事务A查询普通索引并且上X锁写锁,所有查出来的行全部都加锁,事务B进行查询上锁会阻塞,前三个情况都是一样的

 

 

    4.没有索引的情况下,走全表扫描,也知识查询出来的结果才会上锁

    读已提交的级别下,就算上锁,也可以插入数据,但是可重复读的级别情况下是不能插入的,进行插入的事务会阻塞 ,避免了幻读的现象,如果插入的数据跟上锁的数据相邻,就会上锁,如果不相连就不会上锁

      相邻   举例:下图中,查询e为a 的行,插入a1,a1>a,所以会插入在a  和  b  中间,就会上锁,如果插入   2  ,就会插入在1 和 a 中间,就不会上锁

    最极端的情况下,在可重复的隔离级别下,查询某一字段并上锁,是不能修改任何一行数据的,因为比如查询 C =  1 ,当其他行的数据进行修改,将  C 的 值由  2  改为了  1 ,  下一次读取数据也会增加这一行,产生幻读的现象,所以为了避免幻读,就不允许进行修改

  

 

 

    

 

 

 

posted on 2022-03-19 20:48  迎新  阅读(85)  评论(0编辑  收藏  举报