MySQL数据库会自动加锁,为什么还会出现数据读脏?

喵呜oO


这个问题涉及到mysql的术语有脏读,读写锁,事务隔离级别,下面一一来解释。

脏读:事务一修改数据中的记录时,事务还没提交,这时候事务二正好读取到了这条修改过的数据,然后事务一因为某些原因事务回滚,数据回到了原来的状态,事务二读到的数据就是脏数据,整个过程就是脏读!


脏读用大白话来说就是:干哈呀?明明数据库中没有这个数据,哪来的这玩意?

不可重复读:事务一在一个事务中多次读取同样的数据,这时候另一个事务刚好在修改数据,导致事务一多次获取到的数据不一致,这就是不可重复读!不可重复读通常出现在update中!

不可重复读用大白话来说:怎么回事?我吃肉吃着吃着,谁给我整成大白菜了?

幻读: 幻读:事务一先根据条件获取到M条数据,然后事务二又增加或减少了N条数据,导致事务一再次搜索的时候发现多了或者少了N条数据,也就是发生了幻读。通常出现在insert或者delete中 !

幻读用大白话来说就是:啥玩意?刚才是M,转个头就给我整成M±N了,劳资出现幻觉了?

下面来看看mysql中的锁:

写锁(排它锁):获取到排它锁的事务可以对数据进行任何操作,而且别的事务不能获取到数据的任何其他锁!

读锁(共享锁):所有事务都可以公平的获取到数据的共享锁,进行数据的读取!



事务隔离级别有以下几种,读未提交,读已提交,可重复读,串行化,分别会对锁进行不同的控制,

以下的事务隔离级别解决错误数据的能力越来越高:

1,读未提交(0)啥都解决不了(0);

2,读已提交(1)能解决脏读(1);

3,可重复读(2)能解决脏读(1)和不可重复读(2);

4,串行化(3)啥都能解决(1,2,3);


如果mysql开启的事务隔离级别是读未提交,也就相当于没有锁,数据随便读,很容易就能读到脏数据,容易出现脏读的现象,生产环境肯定不能用这样的事务隔离级别!

所以需要保证数据安全并兼容性能,就需要根据场景选择不同的事务传播级别,因为数据错误主要出现在脏读,生产中大多数用的是读已提交事务传播级别!

最近正在持续的分享JAVA,数据库相关的技术,力保通俗易懂,敬请关注。。。


分享到:


相關文章: