1、丢失数据更新
如上图我们可以看出,线程1和线程2都对同一条数据进行更新,
在T8时间点线程2已经完成了数据的更新,在T9时间点如果线程1回滚age=20,那线程2的更新age=25就丢失,
另外一种,如果T9时间点 我们线程1提交,那我们线程2的age=25也丢失了
2、数据脏读
所谓的数据脏读,就是当并发的时候,一个线程进行修改,还未提交事务的时候另一个线程就读取了更新后的数据,但是后面第一个线程回滚,更新无效,那第二个线程读取到的数据就是脏数据
3、数据虚读或者幻读
此处的线程1修改完age之后,线程2立马进来修改了name,并提交事务,线程1在读取我们的数据,发现被修改了2个字段,这就是虚读或者幻读
4、不可重复读
此处线程1先查询age=20,线程2把age修改Wie30,线程1再次查询的时候发现age=30,所以重复读取两次数据不一致,所以重复读取出错,
以上问题在并发中都可能存在,所以我们hiberante一定要处理线程并发的情况,hibernate就需要进行线程同步,提供的机制是利用锁来完成,
悲观锁
所谓的悲观锁,就是hibernate心态不好,认为每一次操作都会出现并发,所以当我们查询数据的时候就直接把这一条数据锁住,不让别人操作。底层是利用的数据库的for update来实现的,就是查询数据的时候利用数据库把当前查询的数据给锁住,不让其他线程操作,实现如下: