1、锁是数据库系统区别于文件系统的关键特性,锁机制用于管理对共享资源并发访问实现数据的完整性和一致性
2、latch成为闩锁,要求锁定的时间非常短,又分为mutex(互斥量)和rwlock(读写锁),没有死锁检测机制
3、lock的对象是事务,用来锁定的是数据库中的对象,如表、页和行等,并且对象仅在commit或rollback后进行释放
4、innodb存储引擎实现了如下两种标准的行级锁
(1)共享锁(S Lock),允许事务读一行数据
(2)排他锁(X Lock),允许事务删除或者更新一行数据
(3)T1已经获得了行r的共享锁,T2也可以获得行r的共享锁,因为读取并不改变行r的数据,这成为锁兼容,但是如果T3想获得行r的排他锁,则必须等T1和T2释放行r上面的共享锁,成为锁不兼容
(4)S锁和X锁都是行锁,兼容是指对同一行(row)锁兼容的情况
(5)show engine innodb status可以查看锁的情况
(6)select * from information_schema.INNODB_LOCKS,用于查看锁的情况
select * from information_schema.INNODB_LOCK_WAITS,用于查看每个事务当前的情况
(7)一致性非锁定读,指的是如果读取的行正在进行删除或者更新操作,则此时读取的是改行的一个快照,即之前版本的数据,该机制极大的提高了事务的并发性,但是在不同的事务隔离级别下,对于快照数据的定义也是不一样的,称为多版本并发控制,即MVCC
(8)READ COMMITED,永远读取最新提交的数据的快照(fresh snapshot),REPEATABLE READ,永远读取事务开始前的数据的快照
(9)行锁有三种算法,分别为:
- Record Lock,单个记录上面的行锁
- Gap Lock,锁定一个范围,但不包括自己
- Next-Key Lock,锁定一个范围,包括自己
(10)幻读指的是在同一个事务中,连续执行两次SQL语句可能会导致不同的结果,第二次SQL语句可能会返回之前不存在的行
(11)脏读指的是一个事务可以读到另一个事务未提交的数据,违反了数据库的隔离性
(12)不可重复读指的是一个事务内多次读取同一数据集合,由于另一个事务提交
(13)丢失更新指的是一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据不一致
(14)阻塞表示一个事务中的锁需要等待另一个事务中的锁来释放它所占用的资源,这就是阻塞
(15)死锁指的是两个或者两个以上的事务在执行过程中因争夺资源而造成的一种互相等待的现象,若无外力作用,则无法继续进行下去
(16)死锁比较好的解决办法就是设置超时时间,一旦一个超时,自动结束争夺资源,另外一个是wait-for graph,可以通过查看图回路来判断是否有死锁