锁
读锁 :共享锁
写锁 : 排他锁
锁分为读锁和写锁,简单理解:对某一行数据加了读锁,其他的人可一来读这一条数据,而不能来更新这条数据,如果加了写锁,其他人既不能更新,也不能读取
但是 两种锁都不能对 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 , 下一次读取数据也会增加这一行,产生幻读的现象,所以为了避免幻读,就不允许进行修改