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) | 否 | 否 | 否 |