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号
浙公网安备 33010602011771号