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锁,是前两者的组合
![img]()
幻读解决
select查询分为快照读和实时读,快照读通过mvcc解决幻读,实时读通过行锁解决幻读
- 快照读:
select查询时,读取的是快照,不会阻塞其他事务的写操作,也不会被其他事务的写操作阻塞,读取的是快照,所以不会出现幻读
转载请标明,谢谢


浙公网安备 33010602011771号