加载中...
锁是数据库并发控制的基础机制,通过限制多个事务对同一资源的并发访问来保证数据一致性。从全局到行级,从悲观到乐观,不同粒度和策略的锁在并发性能和安全性之间提供了丰富的权衡选项。

| 锁粒度 | 表锁 > 页锁 > 行锁 > 间隙锁 |
| InnoDB 默认 | 行级锁(Row Lock) |
| 死锁处理 | 自动检测并回滚代价小的事务 |
按粒度分:表锁(Table Lock)锁整张表,MyISAM 使用表锁,操作简单但并发低;行锁(Row Lock)精确到单行,InnoDB 默认行级锁,并发最高;间隙锁(Gap Lock)锁定一个范围而非具体行,用于防止幻读。
按模式分:共享锁(S Lock)允许多个事务同时读取,互相不阻塞;排他锁(X Lock)只允许一个事务修改,阻塞其他事务的所有访问。InnoDB 还有意向锁(IS/IX),表级意向锁用于快速判断表中是否有行级锁,避免全表扫描。[1]
死锁:事务 A 持有资源1的锁并等待资源2,事务 B 持有资源2的锁并等待资源1,两个事务互相等待形成环形依赖。InnoDB 通过死锁检测(wait-for graph)发现死锁后自动回滚代价较小的事务,应用层需要捕获死锁错误并重试。
乐观锁不是数据库内置的锁,而是一种应用层模式:不在读取时加锁,在更新时检查数据是否被别人修改过(通常通过版本号字段)。伪代码:先 SELECT version,更新时 UPDATE ... WHERE version=old_version,检查影响行数是否为1。冲突率低时乐观锁比悲观锁吞吐量高得多;冲突频繁时大量重试反而更慢。

| 锁粒度 | 表锁 > 页锁 > 行锁 > 间隙锁 |
| InnoDB 默认 | 行级锁(Row Lock) |
| 死锁处理 | 自动检测并回滚代价小的事务 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧