锁的概念
锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中,除传统的计算资源(如CPU、RAM、W/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
锁的分类
通过对数据类型的操作来分:
读/写
读锁:针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
通过对数据操作粒度来分

表锁:偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
表锁
加读锁

当我们锁上mylock的时候,session1可以做一下操作,读mylock,但是不可以修改mylock表的数据(加了读锁,只读),不可以读别的表(因为你这个表已经被锁住了)。
session2就可以读mylock,也可以读别的表,但是不可以修改mylock(session2不拥有锁),会阻塞!。因为被锁住了,只能等待解锁。
加写锁

此时session1可以修改,查询自己,不可以读其他表
session2可以读别的表,如果要写mylock会阻塞,读也阻塞。




行锁
偏向innodb引擎,开销大, 加锁慢,会出现死锁;锁定的粒度最小,发送锁冲突的概率最低,并发度较高。
Innodb和myisam最大的差别:
①增加了事务功能
②采用行级锁

当session1修改第五行的数据,session2想修改第五行会阻塞。然后这时session1执行commit,session2仍然读不到修改后的数据(不可重复得,一个事务内mysql默认可以重复读),当session2也commit就可以读读到了!
索引失效,行锁变成表锁
当我们执行下面两个语句的话,是可以的!(互不相干)

现在session1的where b = 4000失去了他的单引号,完蛋,索引会失效(索引是varchar的b)!

间隙锁的危害



如何锁定一行?

总结


