MySQL事务的隔离级别
SQL标准定义了四个隔离级别:
- READ-UNCOMMITTED(读取未提交):最低的事务隔离级别,允许读取尚未提交的数据变更,可能导致脏读,幻读,不可重复读。
- READ-COMMITTED(读取已提交):可以阻止脏读,但是不可重复度,幻读仍然可能发生。
- REPEATABLE-READ(可重复读):同一事务中,多次一样的查询结果相同,除非数据是被本身事务修改,可以阻止脏读和不可重复读,幻读仍然可能发生
脏读 ——读未提交(read-uncommited)
脏读,也叫读未提交。
首先,第一个连接开启事务,第二个连接也开启事务。第二个连接修改数据,但并未提交。与此同时,第一个连接读取修改后的数据。然而此时第二个事务又回滚。
所以,第一个连接所读取的东西就是就是一个脏数据(因为未的数据也会去读)。因为它和现在的mysql表里面的数据不符合,因为更新sql已经回滚了。
避免脏读 —— 读已提交(read committed)
首先,第一个连接开启事务,第二个连接也开启事务。第二个连接修改数据,但并未提交。与此同时,第一个连接读取,但它只会读已经提交的数据,所以不会读到修改后的数据。
此时,第二个连接提交事务。第一个连接再读,果然读到了更新后的数据。
不可重复读(reapeatable-read)
不可重复读的定义是,数据库访问中,一个事务范围内,两个或多个相同的查询,却返回了不同的结果。