MySQL幻读是什么?了解一下!(mysql什么是幻读)
MySQL幻读是什么?了解一下!
MySQL幻读是指当在MySQL数据库中使用SELECT语句查询数据时,发现某一行的SELECT查询结果的某一列出现了不在第一次查询结果中的值,即出现了“幻觉”(是多出的)的现象,这就是MySQL幻读。
MySQL幻读是由于在事务的处理过程中出现的缺陷而引起的,主要由以下几种情况可能引起:
1.当使用`REPEATABLE READ`或`SERIALIZABLE`隔离级别开启非锁定读取时,将会可能会出现幻读问题;
2.在事务执行过程中,有另外一个事务修改执行查询结果所包含的行,而在一个事务重新查询时,由于存在非锁定读取机制,另外修改的结果会返回到结果集中;
3.由于锁争用而导致的不可重复读问题,也会产生MySQL幻读的情况。
下面来看一下MySQL的幻读的具体案例,以便更好的理解MySQL幻读:
假设有一张叫accounts表,某用户想要转账给另一个用户,也就是将一个用户的资金减少相应的金额,同时另外一个用户的资金增加某种金额,在这过程中,转账操作分两步进行:
1.第一步为查询相关用户当前的余额,使用以下SQL完成:
“`sql
SELECT bal FROM accounts where user_id=’xx’;
2.第二步为修改用户当前余额,使用以下SQL完成:
```sqlUPDATE accounts SET bal = bal - 100 WHERE user_id = 'user_a';
UPDATE accounts SET bal = bal + 100 WHERE user_id = 'user_b';
如果存在另外一个用户在第一步SQL查询用户余额时,之后修改用户余额的操作已经结束,那么读到的余额将是不正确的用户余额,这种情况就是MySQL幻读。
好了,以上就是有关MySQL幻读的基本概念以及例子,一般MySQL幻读都由在查询和修改时出现锁争用导致,不正确的开启事务隔离级别也可以引发MySQL幻读问题,要想解决这种问题,有两个途径,一是改变事务的隔离级别,二是采用乐观锁的机制。