行锁
    gap lock
    next-key lock

    https://www.cnblogs.com/frankyou/p/9582587.html
    mylsam
    MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁
    默认情况下是写优先级要大于读优先级。通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接读比写的优先级高。如果我们的系统是一个以读为主,可以设置此参数,如果以写为主,则不用设置;

    innodb
    对于普通SELECT语句,InnoDB不会加任何锁;对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
    共享锁(S):SELECT FROM table_name WHERE … LOCK IN SHARE MODE 排他锁(X):SELECT FROM table_name WHERE … FOR UPDATE

    间隙锁
    当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;
    对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。
    使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁。
    (1)防止幻读

    意向锁
    而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁
    如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。

    死锁
    上文讲过,MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。
    但在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,当两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。
    在InnoDB的事务管理和锁定机制中,有专门检测死锁的机制,会在系统中产生死锁之后的很短时间内就检测到该死锁的存在。当InnoDB检测到系统中产生了死锁之后,InnoDB会通过相应的判断来选这产生死锁的两个事务中较小的事务来回滚,而让另外一个较大的事务成功完成。

    死锁:
    多个线程互相持有对方所需要的资源时,互相等待
    mysql死锁:
    A
    start
    update where id = 1;
    update where id = 2;
    End

    B
    start
    update where id = 2;
    update where id = 1;
    End
    数据库有死锁检测和超时机制,innodb现在解决的方式是将持有最少行级的排它锁事务回滚