mysql-基础

mysql基础

ACID

  • A: atomicity 原子性
  • C: consistency 一致性
  • I: isolation 隔离性
  • D: durability 持久性

其中A,I,D都是为C服务的

原子性

原子性是指要求事务中所有的操作都不可分割,要么全部成功,要么全部失败。

通过undo log保证原子性。

当事务中某条sql执行失败后,触发回滚,反向执行操作

隔离性

要求事务之间互不干扰,即一个事务不应该看到其他事务中间的数据。

分为:

  • 写+写:通过锁实现
  • 写+读:通过mvcc实现

常见的三个问题场景:

  • 脏读,属于读+写事务A读取到事务B未提交的数据,如果B发生回滚,会出现数据不一致,属于读+写
  • 不可重复读: 属于读+写事务A中两次操作之间,事务B修改了数据,导致A两次读取的数据不一致,侧重于数据修改
  • 幻读:属于读+写事务A中两次操作之间,事务B删除数据,导致事务A前后两次读取数据数量不一致

img

持久性

要求事务提交后,数据不会丢失,不会因为电源故障、系统崩溃等原因导致数据丢失

通过redo log实现。
img

数据保存流程:

  • 写入undo log,保证原子性
  • 写入buffer pool
  • 写入redo log buffer,缓存数据
  • 写入redo log,保证持久性
  • 写入本地磁盘

一致性

img

不管有多少事务在执行,在每次提交、回滚之后,数据库的状态应该是一致且稳定的。

如果多个表中相关数据被更新,应该只看到旧值,或只看到新值,不应该是旧值和新值混合在一起。

锁的应用场景是在写+写

锁信息包括:

  • 上锁事务信息:事务id
  • 被锁的索引信息:聚簇索引和二级索引都可以加锁
  • 锁的类型和模式信息:锁模式lock_mode、锁类型lock_type、行类型rec_lock_type

lock_mode

对查询结果中的每行加锁

  • lock_s: 共享锁(读锁),数据添加共享锁之后,其他事务也可以加新的共享锁,但不能加独占锁
select user where id <10 lock in share mode;
  • lock_x: 独占锁(排他锁,写锁),数据加上独占锁之后,不能再添加任何锁
select user where id<10 for update;
  • lock_ls: 共享意向锁,上锁时,将进行锁标记,这样其他事务在操作该表时,首先看表有没有意向锁即可

  • lock_auto_inc: 自增锁,用于自增主键的并发插入,在插入数据时,生成自增值,同时阻塞其他插入操作,保证值唯一(如果事务发生回滚,自增值不会回滚,所以自增值可能不连续)

show variables like 'innodb_autoinc_lock_mode';
set innodb_autoinc_lock_mode=2;
0: 自增场景自动加自增锁
1;确定插入数量时,采用`2`机制,数量不确定采用`0`
2:自增场景不加锁,直接生成自增值

lock_type

  • table: 表锁,锁住整张表,不管是读还是写,都会锁住整张表,不推荐使用
  • recor: 行锁,只对某些行加锁,使用bit数组纪录那些行加锁

rec_lock_type

根据where条件进行选择

  • lock_rec-not_gap: 精准行锁,锁定某一行
  • lock_gap: 间隙锁,锁住行与行之间的间隙,防止发生插入
  • lock_oridinary: 行next-key锁,是前两者的组合
    img

幻读解决

select查询分为快照读实时读,快照读通过mvcc解决幻读,实时读通过行锁解决幻读

  • 快照读:select查询时,读取的是快照,不会阻塞其他事务的操作,也不会被其他事务的操作阻塞,读取的是快照,所以不会出现幻读
posted @   我才不是老家伙  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示