解释一下脏读、不可重复读、幻读、更新丢失
脏读(Dirty read):在一个事务中读取到另一个事务已经修改但没有提交的数据。
例如,事务A对数据进行了修改,但是还没有提交,这时事务B读取这个数据,然后事务A回滚,那么事务B取的数据无效。不符合一致性。
解决办法:把数据库的事务隔高级别调整到READ_COMMITTED
不可重复读(NonRepeatable Read):不能读到相同的数据内容,事务A读取到了事务B已经提交的修改数据(即一个事务范围内两个相同的查询却返回了不同数据)。
例如事务A先读取数据,然后事务B对该同一数据修改并提交,那么事务A再次读取该数据时,由于事务B对该数据的修改,事务A两次读到的的数据可能是不一样的。不符合隔离性。
解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ
幻读(Phantom Read):事务在插入已经检查过不存在的记录时,发现这些数据已经存在了(针对的insert操作)。
在事务A查询结束后,事务B往User表中插入了一条id为1的数据。此时,由于事务A查询到id为1的用户不存在,因此插入1条id为1的数据,报错:主键冲突,不符合隔离性。
解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ
更新丢失(Update lose):两个事务同时操作相同数据,后提交的事务会覆盖先提交的事务处理结果。