一、从属性分
- 共享锁(读锁)
在一个事务中,对数据加上读锁之后,其他事物只能加读锁,不能加写锁。 - 排它锁(写锁)
在一个事务中,对数据加写锁后,其他事物不能加任何锁。表锁不需要等待事务提交就可以释放。行锁事务提交后才会释放
二、从粒度分
表锁,行锁,页锁(BDB引擎独有),记录锁,间隙锁,临键锁
三、从锁的状态分
意向共享锁,意向排他锁
更新某一行,事务还没提交。修改表结构会怎样?
更新某一行会加行锁,事务没提交,行锁未释放,修改表结构会加表锁。修改表结构会阻塞。事务提交后才会执行
快照读
select xx from xxx
不加锁的普通 SELECT 都属于快照读。
单纯的查询操作叫做快照读,使用mvcc版本控制,其他事务操作不可见
但是不能完全解决幻读。事务A查询得到10条记录,事务B插入一条id=11。事务A在查询仍然是10条。但是事务A可以修改id=11的数据,事务A在查询会查询到11条记录。这种还是会产生幻读。
当前读和update detele都是使用next-key Lock算法
select for update
next-key Lock就是间隙锁加行锁
锁住上下两个间隙。在锁住索引
如果where条件不走索引,next-key Lock会锁住表的所有间隙和所有记录。相当于锁表
快照读根据readView和undolog结合实现事务的隔离
每行记录最后面隐藏了最新的版本号trx,并且隐藏了此版本指向undolog的指针
undolog保存了一个版本链。如果事务id与trx相等,直接返回mysql数据即可,如果不相等需要去undolog根据版本链找到对应版本数据返回