(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语句,都串行执行

posted @ 2022-02-14 15:03  、嘎路的米。  阅读(32)  评论(0编辑  收藏  举报