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
前后两次读取数据数量不一致
持久性
要求事务提交后,数据不会丢失,不会因为电源故障、系统崩溃等原因导致数据丢失
通过redo log
实现。
数据保存流程:
- 写入
undo log
,保证原子性
- 写入
buffer pool
- 写入
redo log buffer
,缓存数据 - 写入
redo log
,保证持久性
- 写入
本地磁盘
一致性
不管有多少事务在执行,在每次提交、回滚之后,数据库的状态应该是一致且稳定的。
如果多个表中相关数据被更新,应该只看到旧值,或只看到新值,不应该是旧值和新值混合在一起。
锁
锁的应用场景是在写+写
锁信息包括:
- 上锁事务信息:事务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锁,是前两者的组合
幻读解决
select
查询分为快照读
和实时读
,快照读通过mvcc
解决幻读,实时读通过行锁
解决幻读
- 快照读:
select
查询时,读取的是快照
,不会阻塞其他事务的写
操作,也不会被其他事务的写
操作阻塞,读取的是快照
,所以不会出现幻读
转载请标明,谢谢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构