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,即启用间隙锁
    临键锁