1. 锁

为了保证数据的一致性 在共享数据被并发访问时变得安全的规则

  • 按操作

    • 共享锁 读锁 针对同一份数据 多个事务读取操作可以同时加锁而不互相影响 但不能修改数据
    • 排他锁 写锁 当前操作没有完成前 会阻断其他操作的读取和写入
  • 按力度

    • 表级锁 会锁定整个表 开销小 加锁快 锁定力度大 发生锁冲突概率高 并发度低 不会出现死锁情况
    • 行级锁 会锁定当前行 开销大 加锁慢 锁定力度小 发生锁冲突概率低 并发高 会出现死锁情况
  • 按使用方式

    • 悲观锁 每次查询数据都认为别人会修改 查询时加锁
    • 乐观锁 每次查询数据都认为别人不会修改 但更新时会判断一下期间别人有没有去更新这个数据

11. 锁 - 图1

2. 共享锁

特点: 数据可以被多个事务查询 但不能修改

InnoDB 默认的是加行锁 如果列没有索引则加的是表锁

如在有锁情况下修改 锁释放 修改数据失败

  • 创建 select语句 lock in share mode;

3. 排他锁

加锁后 不能被其他事务加锁查询或者修改 (即不能存在第二把锁)

普通查询可以 加锁查询不能 普通和加锁修改都无法执行 必须提交事务

  • 创建 select语句 for update;

4. MyISAM 读锁

所有连接只能查询不能修改数据

MyISAM 不支持事务 和 行锁 当前表也不能修改

  • 加锁 lock table 表名 read;
  • 解锁 unlock tables;

5. MyISAM 写锁

其他连接不能查询和修改数据 当前表可以查询和修改数据

  • 加锁 lock table 表名 write;
  • 解锁 unlock tables;

6. 悲观锁和乐观锁

以上都都是悲观锁 悲观锁一般都是依靠关系型数据库提供的锁机制

悲观锁和乐观锁 差别是一个执行前上锁 一个是不上锁 只是在更新时查看是否与被修改

  • 添加一个版本号列 每次更新版本号+1 并在更新时检测版本号是否与查询时相同