最近在看有关锁的知识, 见到的名词那叫一个多啊, 完全懵逼了
1.乐观锁,悲观锁, Innodb行锁,读锁(共享锁),写锁(排他锁),意向共享/排他锁, 间隙锁, 更新锁 这些词太混乱了, 有没有资料理的比较清楚 到底之间都什么关系
2.乐观锁 : 网上的实现方案大部分都是说加一个 version 字段, 或者timestamp字段; 然后又找到一份如下方案,"在更新时候带入原始数据", 具体如下:
比方说,要把一个字段status从 yes 变为 no,
update table set `status`=`no` where status='yes'
这三种方案, 最后一种也是乐观锁么? 最后一种在Innodb存储引擎下,innodb对更新语句不是会自动加排他锁么?这个排他锁应该是数据库的真正锁吧,怎么能是乐观锁? 况且很多资料都说排他锁就是悲观锁!
参考的资料如下:
http://www.jianshu.com/p/a40f...
http://www.itpub.net/thread-1...
http://blog.csdn.net/u0109564...
1、问题1
Innodb行锁的模式:共享锁(又叫读锁,S锁)、排他锁(又叫写锁、X锁)
Innodb行锁的类型:Record Lock(行记录锁)、Gap Lock、Next-key Lock(Next-key Lock=Record Lock+Gap Lock,可以参考https://my.oschina.net/hebaod... lock)
意向锁:属于表锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁
IS、S、IX、X锁的兼容性为:
乐观锁与悲观锁是一种用于并发控制的手段,这就不仅仅限于数据库的层面锁了,悲观锁利用排他锁实现,不允许其他人并发修改。具体概念可自行Google
2、问题2
举例中update是一种乐观锁,乐观锁的一种实现就是版本控制,status可以认为就是版本,符合某个版本我就更新它。