https://blog.csdn.net/u013521882/article/details/85275987
一、乐观锁
乐观锁,简单地说,就是从应用系统层面上做并发控制,去加锁。
实现乐观锁常见的方式:版本号version
CAS乐观锁实现 比较与设置
二、悲观锁
悲观锁,简单地说,就是从数据库层面上做并发控制,去加锁。
悲观锁的实现方式有两种:共享锁(读锁)和排它锁(写锁)
共享锁 独占锁 排序锁 自增锁 临键锁
http://nicethemes.cn/news/txtlist_i34993v.html
记录锁、间隙锁、临键锁都是排它锁
自增锁 (并发不需要自增)
专门针对事务插入AUTOINCREMENT类型的列。
最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。
记录锁/行锁
SELECT * FROM test WHERE id=1 FOR UPDATE; 以阻止其他事务插入,更新,删除 id=1 这一行
行记录锁是作用在索引记录(Key)上的锁。(B+树上的Key节点)
语义上是“锁定一行数据”,做并发操作的保护。
注意点:
1、记录锁是作用在索引上的锁,如果建表时候没有设置任何一个索引,InnoDB引擎会使用隐式的主键来进行锁定。
2、InnoDB行锁是作用在索引上的锁,只有查询走索引时才会用到。如果SQL查询时没有使用任何一个索引,则会升级为“表锁”。
3、InnoDB行锁是作用在索引上的锁,即使是访问不同行的数据记录,但如果使用的是同一个索引键(KEY),会发生锁冲突_。
4、如果数据表建有多个索引,可以通过不同的索引锁定不同的行
间隙锁 在rr级别可重复读
show variables like ‘innodb_locks_unsafe_for_binlog’;
innodb_locks_unsafe_for_binlog:默认值为OFF,即启用间隙锁
临键锁
