在我们开发中很容易因一些代码规范和逻辑控制的不足造成很多问题:

脏读: 一个事务读取到了另一个事务未提交的数据。

例:比如A给B转账,A给B打了100,但是还没有确认,这时,B收到100就跟A说我收到了。那么A就不会提交,既然B收到钱了,我就不用打了,就执行回滚操作。这就是个脏读了,B读取到了A未提交的数据。

不可重复读:一个事务读取数据时,读取到了别的事务插入的数据,导致前后数据读取不一致。

例:A查询自己的账户有多少钱,查到了100,这时B偷偷给A转账100,A读取读到了200,两次金额不一样,A会想是不是出什么问题了。

幻读:幻读和不可重复读差不多,就是有个差别,幻读主要指查询的记录的条数不一致,不可重复读就是单个行数的数据读取不一致。

首先我们要知道有哪几个隔离级别:

按级别从低到高:
读未提交(Read uncommitted)
读已提交(Read commited)
可重复读(Repeatable read)
串行化(Serializable)

使用不同隔离级别可能会出现的问题:

隔离级别

脏读

不可重复读

幻读

读未提交

读已提交

可重复读

串行化

注:隔离级别越高,并发效果越差,甚至造成死锁这种麻烦

原文链接:一文搞懂数据库隔离级别及解决方案_java中针对数据库的隔离级别出现的问题及解决方案-CSDN博客