Java for Web学习笔记(一三八)篇外之数据库的ACID和JPA(2)JPA
程序员文章站
2022-03-02 15:23:07
...
在测试中,我们发现在一个JPA事务中:
- Spring Data的写SQL是在最后commit前发出,这最大程度地缩短了写操作和commit之间的时间。
- 对相同的ID的读,JPA只从数据库中读取一次。
- 从数据库中获取entity,修改entity的数据,即使最后没有执行save,在commit之前,发送update。
下面是其中一个测试小例子:
@Transactional
public void acidTest() {
TestAcidEntity entity1 = testAcidRepository.findOne(1L);
sleep(2);
entity1.setScore(entity1.getScore() + 1);
testAcidRepository.save(entity1);
sleep(4);
TestAcidEntity entity2 = testAcidRepository.findOne(2L);
entity2.setScore(entity2.getScore() + 10);
sleep(2);
testAcidRepository.save(entity2); //可以将此注释掉,观察是否有update消息
}
private void sleep(int secs) {
try {
Thread.sleep(secs * 1000);
} catch (InterruptedException e) {
}
}
通过网络抓包(将jdbc连接参数加上useSSL=false)进行观察:
代码顺序:select1 → 2秒 → update1 → 4秒 → select2 → 2秒 → update2 → commit 网络抓包显示的SQL顺序 :select1 → 6秒 → select2 → 2秒 → update1 → update2 → commit