JPA操作数据库中的脏数据更新作用

时间:2024-04-13 20:17:10

脏数据来由

脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据

脏数据更新

作用:持久化对象,一旦修改,事务提交的时候也会自动修改
1、没有执行meger,也能完成修改
2、加了meger,内容没有改变,方法也没有执行
执行流程分析:
第一步:拿到entityManager,开启事务
第二步:
通过entityManager拿到一个对象,那么现在这个对象就是持久化的对象
这个对象会放到一级缓存里面
JPA会为当前这个对象准备一个快照(把这个对象进行了备份)
第三步:提交事务
它会把快照 与 你现在这个对象的数据进行对比
如果相同,就不需要修改,也不会发送SQL(性能就高了)
当不相同的时候,JPA就会认为现在这个数据是脏数据
脏数据它就会在事务提交的时候,把它进行数据库的同步(发送update SQL语句)

JPA操作数据库中的脏数据更新作用

@Test
public void update() throws Exception {
save();

EntityManager entityManager = JPAUtils.getEntityManager();
entityManager.getTransaction().begin();

StateDomain stateDomain = entityManager.find(StateDomain.class, 1L);// 持久状态
stateDomain.setName(“stateDomain”);
// 写不写效果是一样
entityManager.merge(stateDomain);// 持久状态

entityManager.getTransaction().commit();
entityManager.close();// 游离状态
}