MYSQL学习系列(二) innodb 事务隔离级别
事务隔离级别
- 读未提交
当数据库系统使用READ UNCOMMITTED隔离级别时,一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新。会出现脏读的问题。 - 读已提交
当数据库系统使用READ COMMITTED隔离级别时,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且还能看到其他事务已经提交的对已有记录的更新。会出现不可重复读的问题。 - 可重复读
当数据库系统使用REPEATABLE READ隔离级别时,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。会出现幻读的情况。 - 串行化读
当数据库系统使用SERIALIZABLE隔离级别时,一个事务在执行过程中完全看不到其他事务对数据库所做的更新。当两个事务同时操作数据库中相同数据时,如果第一个事务已经在访问该数据,第二个事务只能停下来等待,必须等到第一个事务结束后才能恢复运行。因此这两个事务实际上是串行化方式运行。
异常情况
- 脏读:读取到其他事务未提交的数据
- 不可重复读:在一个事务中,前后两次读取的数据不一致,数据被其他的事务修改了。可能是修改,也可能是删除。
- 幻读:其他博文写的很混乱,找到一篇阐述较清晰的博文。博克地址
若想避免幻读,且不想一刀切的修改事务级别,可以采用SELECT FOR UPDATE的方式添加排他锁。
不可重读侧重表达 读-读 的场景
幻读侧重表达 读-写 的场景
隔离级别 | 脏读 | 非重复读 | 幻读 |
---|---|---|---|
read uncommitted | 允许 | 允许 | 允许 |
read committed | 允许 | 允许 | |
repeatable read | 允许 | ||
serializable |