锁分类
行锁原理
InnoDB行锁是通过对索引数据页上的记录加锁实现的,主要实现算法有3种:
Record Lock锁:/ˈrekərd/ 锁定单个行记录的锁。(记录锁,RC(读已提交)、RR(可重复读)隔离级别都支持)
Gap Lock锁:间隙锁,锁定索引记录间隙,确保索引记录的间隙不变。(范围锁,RR(可重复读)支持)
Next-key Lock锁:记录锁和间隙锁的结合,锁住记录的同时,并且锁住数据前后的范围。(RR(可重复读)支持)
悲观锁
表级锁
表级锁每次操作都锁住整张表,并发度最低。命令:
手动增加表锁:lock table 表名称 read|write,表名称2 read|write;
查看表上加过的锁:show open tables;
删除表锁:unlock tables;
表级读锁:当前表使用read锁,当前连接和其他连接都可以进行读操作;当前连接执行增删改时会报错,其他连接增删改时会阻塞;其他连接可追加read锁;其他连接追加write锁将被阻塞。
表级写锁:当前表使用write锁,当前连接可以进行增删改查操作;其他连接增删改查将会被阻塞;其他连接追加read或write锁均被阻塞。
行级锁
行级锁是依赖于索引的,所以当操作没有用到索引时,全表会被锁定,包括间隙锁,其他事务进行增删改时会被阻塞,可以查询但是不能获取排他锁。
乐观锁
乐观锁和悲观锁都能解决数据库的写写问题;但是乐观锁并发处理能力更高。
乐观锁实现原理
使用版本字段(version)
先给表中增加版本(version)字段,每操作一次,将版本号加1。每次提交事务会和现有的version对比,大于等于说明数据被其他事务修改过了。


使用时间戳(Timestamp)/ˈtaɪmstæmp/
与version相似,也需要给数据表增加一个字段,字段类型使用timestamp时间戳。在提交更新的时候检查当前数据库中数据的时间戳和自己更新前渠道的时间戳对比,如果一致提交更新,否则就是版本冲突,更新失败。
除了手动实现乐观锁外,许多框架也封装了乐观锁的实现,比如hibernate框架;MyBatis框架可以使用OptimisticLocker插件来扩展实现
其他章节 -> 跳转
end...