在MYSQL中,总共有四种事务隔离级别,如下所示👇
READ UNCOMMITTED
最低级别的隔离,在这一级别我们可能会遇到所有的并发问题(脏读,幻读..)
场景:
READ COMMITTED
不会读取没有其他事务没有提交的数据,有效的防止了脏读,但是不可重复读
REPEATABLE READ (MYSQL 默认)
保持单事务,数据一致性。能有效防止大多数并发问题,MYSQL默认的事务隔离级别,但是不可防止幻读
SERIALIZABLE
序列化隔离,当事务执行时候,会检查是否有其他事务在对数据进行操作,并序列化的排列事务的处理顺序,可以防止幻读
Lost Updates:
当两个不同的事务试图同时更新数据库中同一行上的同一列时,就会发生更新丢失。 通常,一个事务更新特定行中的特定列,而另一个事务在不久之后开始,在更新相同值之前没有看到此更新。 第一个事务的结果然后“丢失”,因为它只是被第二个事务覆盖。
Dirty Reads:
就是说一个事务A执行的时候,另外的事务B更新了数据但是没有提交!这时候如果A如果获取数据,会获取到B没有提交的数据,B出于某些原因可能会失败。这时候A拿到的数据就是脏数据。
Non-repeating Reads:
就是说一个事务A执行的时候,假如说有两条查询语句,第一条执行完,开始执行第二条之前,其他的事务B 更新了数据,并且COMMITED,这时候事务A的第二条查询语句就会取到更新后的数据,这样一个事务同一条数据就会出现两个不同的值。
Phantom Reads:
就是说事务A执行的时候,比如说给积分>300的客户发折扣券,当A开始事务但还没执行的时候,其他的事务B,已经更新了某位用户的积分大于300了,这时候,事务A是拿不到那个B更新的客户的,所以就会出现幻读的问题。
最后用一张图来说明: