(05)存储引擎 & 隔离级别
1. 存储引擎
1.1. MyISAM
只支持表锁:加锁时,会锁定整张表数据。
表读锁
加锁:LOCK TABLE table_name READ;
解锁:UNLOCK TABLES;
表写锁
加锁:LOCK TABLE table_name WRITE;
解锁:UNLOCK TABLES;
MyISAM会自动帮我们上锁,我们对MyISAM存储引擎操作时,无需关注如何上锁
1.2. InnoDB
支持表锁,也支持行锁。加锁时,可以锁定某行,或者锁某张表。
注意:InnoDB使用索引作为条件时,才是行锁。如果条件不是索引,则是表锁
明确指定主键或索引,并且数据真实存在,行锁。如果换成其他非索引字段,表锁。
select status from t_goods where id = 1 for update;
明确指定主键或索引,但数据不存在,无锁
select status from t_goods where id = 0 for update;
主键或索引不明确,表锁
select status from t_goods where id <= 3 for update;
无主键或索引,表锁
select status from t_goods for update;
读锁
加锁:select ... lock in share mode
解锁:提交事务自动解锁
写锁
加锁:select ... for update
解锁:提交事务自动解锁
InnoDB 中的锁,必须在事务中才能使用
1.3. 总结
2. 事务隔离级别
2.1. 读未提交
使用该级别会存在脏读
脏读:一个事务读到了另一个未提交的事务
举例:A窗口给B窗口转500块钱(A没有提交事务),B窗口读取到了A窗口中的未提交的事务的数据(B也没有提交事务)
2.1. 读已提交
使用该级别会存在不可重复读
不可重复读:一个事务读到了另一个已提交的事务。
举例:A窗口给B窗口转500块钱(A没有提交事物),B窗口读到了原始的数据(B也没提交事务),当A提交事务后,B读到了A提交的事物的数据(B还是没有提交事务)。一个事务内,两次读取到的数据不一致,这就是不可重复读
2.1. 可重复读(默认级别)
使用该级别会存在幻读
幻读:一个事务重复插入另外一个已提的交事务插入的数据。
举例:
1、A窗口插入id=3的数据(A未提交事务)。
2、B窗口读数据时,没有读到id=3的数据(B未提交事务)。
3、B窗口插入id=3的数据,插入语句出现等待状态。(B未提交事务)
4、A窗口提交事务。B窗口退出等待状态,并且插入语句出现主键重复异常。
2.1. 序列化
相当于所有的sql语句,都串行执行