普通的 select 语句:select from t1 where id = 1;
    加读锁的 select 语句:select
    from t1 where id = 1 lock in share mode;
    加写锁的 select 语句:select * from t1 where id = 1 for update;


    对于普通的 select 语句,使用的是快照读,或者称为一致性读,基于 MVCC 判断数据版本的可见性,读的时候不需要加锁,也不受锁的限制。
    对于加读锁 / 写锁的 select 语句,使用的是当前读,读取最新版本的数据,但是受锁的限制。
    对于 update 语句,基于最新版本的数据修改;加写锁,事务提交后,释放写锁。


    InnoDB 的锁,与索引类型,事务的隔离级别相关。
    InnoDB 到底是行锁还是表锁取决于你的 SQL 语句。
    InnoDB 的行锁是实现在索引上的,而不是锁在物理行记录上。
    如果查询没有命中索引,也将退化为表锁。
    所以如果访问没有命中索引,也无法使用行锁,将要退化为表锁。