
重点维度 Java synchronized MySQL InnoDB行锁锁载体 Java 对象Object 索引记录数据行资源载体谁指定 开发者手动传入objSQL的where条件自动定位竞争者 线程 事务释放时机 代码块执行结束 事务commit/rollback兼容规则 排他不支持共享锁 区分S共享 / X排他支持共享共存核心where条件的字段没有建立索引就会升级为表锁。案例共享锁共存。就是共享锁可以被多个事务同时持有。死锁业务切记先查后改的场景绝对不要用 lock in share mode极易死锁直接使用 for update 。全局锁锁住整个数据库实例表级锁表级锁分为表锁元数据锁意向锁。表锁分为读锁和写锁读锁不阻塞dql只阻塞其他客户端的dml/ddl本客户端的dml/ddl好像直接失败。全部客户端可以dql不可以dml/ddl。场景只读后续不用修改。如财务月底对账统计报表。写锁本客户端可以dqldml/ddl。其他客户端不可以dqldml/ddl。场景库存订单状态变更。元数据锁意向锁意向锁之间不会互斥事务a加了行锁事务b想加表锁就得一行一行扫描有没有行锁性能不好。有了意向锁不需要逐行检查行锁的情况优化了加表级锁的速度。主要解决行锁和表锁的冲突问题。行级锁行级锁主要分为行锁间隙锁临键锁。索引结构b树结构行锁不通过索引条件检索数据行锁就会升级成表锁间隙锁锁的是间隙不锁对应的记录。唯一索引给不存在的记录加锁时优化为间隙锁。临键锁非唯一普通索引在进行等值匹配的时候会把该行以及该行的前后间隙都锁上。没匹配到呢加间隙锁呗唯一索引使用范围查询也会加上临键锁总结唯一索引--》等值查询只有唯一索引等值查询才存在降级。命中-记录锁未命中-间隙锁。任意索引 范围查询不降级使用临键锁向后延伸还会追加间隙锁。