mysql高级
一、Innodb和myisam区别
Innodb | Myisam | |
支持事务 | 支持 | 不支持 |
锁单位 | 行级锁 | 表级锁 |
全文索引 | 不支持 | 支持 |
支持外键 | 支持 | 不支持 |
二、事务特性
1、原子性:要么全成功,要么全失败,其中一个错误那就回滚
2、一致性:保证原子性,保证最后数据没有异常
3、隔离性:事务在未提交之前,事物之间是互相隔离的
4、持久性:执行完之后数据会永久保存
三、事务隔离特性,默认是可重复读
脏读:事务A读了事务B数据,事务B回滚,A读的数据称为脏数据
幻读:事务A更改了所有数据,此时事务B插入一条数据,A以为看错了,产生幻觉
不可重复读:事务B在多次读取一条数据,此时事务A更改了这条数据,导致事务B多次读取数据不一致
事务隔离级别 | 脏读 | 幻读 | 不可重复读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 是 | 否 |
串行化(serializable) | 否 | 否 | 否 |
四、锁机制
1、按照锁的互斥达成度分为:
共享锁:读取数据时加S锁,之间不互斥
排他锁:修改数据时加X锁,与任何锁互斥
2、按照锁颗粒度分为:
表锁
意向锁:意向锁分为意向共享锁和意向排他锁
例如:
意向共享锁:select ... lock in share mode;
意向排他锁:select ... for update;
自增锁:自增值时,如果A,B事务同事插入,A先进入的话,必须等A执行完B才可以,否则B会被阻塞
例如:insert into tabel1 (id,value) values(2,1111)
行锁
间隙锁:它封锁索引记录中的间隔,阻止其他事务对该范围操作
例如:select * from table1 where id between 8 and 15 for update;
记录锁:命中索引,阻止其他事务对这行操作
例如:select id=1 from table1 for update;
插入意向锁:属于间隙锁的一种特殊情况,专门针对insert操作。指多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此
例如:事务A:insert into table1(id,value) values(1,'v1') 事务B:insert into table2(id,value) values(2,'v2') ;2个事务互不排斥
临键锁:是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间
例如:事务A执行,未提交:select * from table1 where id = 20 for update;事务B执行:insert into table1(value) values('vlock');会阻塞。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步