1. 程式人生 > >Java for Web學習筆記(一三八)篇外之資料庫的ACID和JPA(2)JPA

Java for Web學習筆記(一三八)篇外之資料庫的ACID和JPA(2)JPA

在測試中,我們發現在一個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