2016-11-12 24 views
1

我有兩個實體:MessageSessionMessageSession的關係爲@ManyToOnespring-data postgres事務隔離問題

我有一個春天的數據倉庫和行動答:

@Query("select c from Messages c where c.session.mode=0 and c.field=5") 
List<Messages> findMessages(); 

然後我過程中發現數據

messages.ForEach(message->{ 
    Session session = message.getSession(); 
    sessionClose(session); 
    newSessionOpen(); 
}) 

和其他服務類我有

Session session=findOpenedSession(); 

的問題是:

如果行爲A在交易中並且在它開始之後並且在結束其他服務之前將會請求打開Session或將嘗試將記錄插入到Message表中?

換句話說,我們有:

  1. 交易開始
  2. 記錄被讀取
  3. Session情況下獲得一個循環處理 - Session使用sessionClosenewSessionOpen
  4. 交易結束

如果某些其他過程將請求在2和4或2和3之間打開Session或在某個地方打開Session? 那麼它會打開Session它會讀取?舊的還是新的? 我使用postgres和@Transactional Spring註釋。

+0

您完全困惑了我。當你說會話時,你的意思是你創建的一個jpa實體還是一個休眠會話?或者有時可能是一個,有時是另一個? –

回答

1

假設你的問題中的'會話'總是指你創建的實體。

根據此:https://www.postgresql.org/docs/9.1/static/transaction-iso.html postgres的默認隔離級別防止髒讀。因此,除非事務提交(即結束),否則其他事務將無法看到第一個事務中所做的任何更改。

根據相同的來源,您可以將事務隔離級別設置爲未讀取。在這種情況下,第二個事務可能能夠看到第一個事務完成的更改,儘管第一個事務尚未提交。請注意,對實體的更改不會立即寫入數據庫,而只會在事務結束之前刷新,在選擇執行之前顯式調用flush或配置。因此,儘管您的數據庫設置可能允許髒讀,但由於JPA /休眠的行爲,您可能不會遇到它們。