①第一是脏读,比如事务A读取了一条记录的值并进行了修改,但在事务A提交之前,又来了个事务B也读取了这条记录的值,导致事务B读取的是一条脏数据。
第二是不可重复读,比如在事务A内,两次读取同一条记录,但返回的结果不一样,这是因为在事务A的两次读取之间,有一个事务B对这条记录进行了update操作。
第三是幻读,比如在事务A内,两次使用相同的select查询语句,但返回的记录条数不一样,这是因为在事务A的两次查询之间,有一个事务B对这些记录进行了insert或delete操作。
第四是更新丢失,比如事务A和事务B并发修改同一条记录时,读到了相同的值,此时如果事务A先提交,后提交的事务B就可能会覆盖掉事务A的更新结果,相当于丢弃了事务A的更新。
②解决方法是对事务进行隔离,MySQL中有4种隔离级别。
第一种,读未提交,这是最低的隔离级别,允许一个事务读取另一个事务还未提交的数据,可能会导致脏读、不可重复读和幻读。
第二种,读已提交,每个事务只能读取其他事务已经提交的数据,能解决脏读,但不能解决不可重复读和幻读。
第三种,可重复读,保证了在同一个事务内,多次读取同一条记录得到的结果是一样的,能解决脏读和不可重复读,但不能解决幻读。
第四种,串行化,这是最高的隔离级别,保证了每个事务按照顺序依次执行,能解决脏读、不可重复读和幻读。
对于更新丢失问题,我们可以使用悲观锁,只有获取到锁才能读取和修改数据,修改完后再释放锁。