MySQL的事务隔离级别

MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ)

1) 读未提交(READ UNCOMMITTED)

另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)(隔离级别最低,并发性能高)。

2) 读已提交(READ COMMITTED)

本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果,这个也叫做不可重复读。

会出现不可重复读、幻读问题(锁定正在读取的行)。

3) 可重复读(REPEATABLE READ)  mysql默认的事务隔离级别

在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的,但是,会有幻读现象。会出幻读(锁定所读取的所有行)。

4) 串行化(SERIALIZABLE)

读操作会隐式获取共享锁,可以保证不同事务间的互斥(锁表)。

四个级别逐渐增强,每个级别解决一个问题。

1) 脏读。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。

2) 不重复读。解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,那么本事务先后两次读到的数据结果会不一致。

3) 幻读。解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务看不到另一个事物提交的数据。

MyISAM: 不支持事物,表级锁。

InnoDB: 事物级存储引擎,支持行锁,事物ACID特性。

 

大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

隔离级别的设置只对当前链接有效。

设置数据库的隔离级别一定要是在开启事务之前。

 

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
串行化(serializable)
posted @ 2020-01-05 22:41  gaopengpy  阅读(215)  评论(0编辑  收藏  举报