数据库隔离级别
首先我们来分析一下为什么数据库需要隔离。
隔离的原因是因为数据库中的数据可能会出现脏读、不可重复读、幻读这三种问题。
脏读
脏读是指一个事务处理过程中读取了另一个事务没有提交的数据。
举个例子说明一下,假定原字段值为100,此时事务A读取该值并尝试修改为200,事务B读取该值为200,事务A修改该值为200失败,原字段值为100,此时就出现了事务B读取的值为200,与数据库中的不一致的情况,读取了脏数据,产生了脏读。
脏读是绝对不允许出现的。
不可重复读
不可重复读的意思是事务A两次读取同一个值,读取到的值却不一样。原因是事务A在两次读取期间,有其他的事务对该值成功地进行了修改。
不可重读读与脏读的不同是:脏读读取了别的事务没有成功提交的数据,不可重读读读取了别的事务已经提交的数据。
幻读
比如事务A将某一列的值全部更改为了1,此时事务B向表中插入了一条数据,并且该列的值为0。A查询所有数据时,发现有一列的值不是1,这就是幻读。(感觉自己的操作出现了错误)
幻读与不可重复读的不同点事幻读读的不是同一条数据,不可重复读读取的是同一条数据。
针对上面三个问题,数据库采取了4中不同程度的隔离级别。
1.Read uncommited(未提交读)
最低级别,不能保证任何情况。
2.Read commited(提交读)
可以解决脏读
3.Repeatable read(可重复读)
可避免脏读,可避免不可重读读
4.Serializable(可串行化)
最高级别,可避免脏读、不可重读读、幻读(使用表锁实现,最安全)
Mysql数据库默认隔离级别为Repeatable read。
一般其他数据库为Read commited。