mysql事务隔离级别
事务,在计算机术语中是一般指访问并可能更新数据库中各种数据项的一个程序执行单元。特别是在并发系统中,同一事务单元可能同时在执行去操作同一段数据,就好比多个人去洗一批盘子,如果没有很好的隔离,就会造成很多数据问题。那我们看一下都有哪些数据问题呢?
(一) 脏读:A事务对数据进行修改但还没有提交,B事务已经读到了,B事务这种行为就是脏读
(二) 不可重复读:A事务对数据进行修改切已提交,B事务就读到了,B事务这种行为就是不可重复读,就是说在B事务里面第一次读和第二次读数据不相同
(三) 幻读:假如一个数据表有一个字段flag,并且该数据表共有10条数据。A事务将数据表中的flag字段的值全部设置为1后(A事务还没提交),B事务又写入一条数据(flag字段为0)并提交,此时再在A事务中查询修改结果发现仍有一条数据没有修改(B事务写入的),A就觉得很怪异(幻读)。其实幻读与不可重复读很像,只是侧重点不同,不可重复读的重点是修改(同样的条件, 你读取过的数据,再次读取出来发现值不一样了),幻读的重点在于新增或者删除(同样的条件, 第 1 次和第 2 次读出来的记录数不一样)
为了解决这些问题,mysql给出了四种隔离级别
1. READ_UNCOMMITTED:最低级别,允许脏读、不可重复读、幻读
2. READ_COMMITTED:允许不可重复读、幻读,不允许脏读
3. REPEATABLE_READ:允许幻读、不允许不可重复读、幻读
4. SERIALIZABLE:最高级别,不允许脏读、不可重复读、幻读
大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle.
少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎