2011-12-29 111 views
1

在Hibernate阻塞中寫入特定操作嗎?我的意思是,如果我執行:在Hibernate中阻止寫入操作

session.save(data); 

從一個方法被標註爲@事務,是保證每個

session.get(id); 

電話,從不同的線程來了,這條線後立即執行,會返回正確的數據(不爲空)?

回答

1

您得到的結果取決於事務隔離級別。 Spring允許以下隔離級別:

DEFAULT 使用基礎數據存儲的默認隔離級別。

READ_COMMITTED 一個常量,指示防止髒讀;不可重複讀取和幻像讀取可能發生。

READ_UNCOMMITTED 一個常量,指示可能發生髒讀,不可重複讀和幻讀。

REPEATABLE_READ 一個常量,指示防止髒讀和不可重複讀取;幻像讀取可能發生。

SERIALIZABLE 一個常量,指示可防止髒讀,不可重複讀取和幻讀讀取。

調用save()(或flush())不保證事務被提交。在調用get()之前提交事務(調用save()時)提交的情況下,您將始終在新線程中獲取正確的結果。但是,如果事務未提交,您是否得到正確的結果取決於事務隔離級別。您將在允許「髒讀」的隔離級別中得到正確的結果。

+0

我怎樣才能確定發生這種情況?我應該嘗試手動提交交易嗎?或者,也許我可以設置一個標誌,我將該方法聲明爲TRANSACTIONAL? – preslavrachev 2011-12-29 07:40:12

+0

爲什麼你想要這種行爲?如果要確保發生這種情況,可以使用調用get()事務性的方法,隔離級別爲READ_UNCOMMITTED。儘管如此,你可能會得到一些髒讀。 – 2011-12-29 09:01:01

0

除非明確使用悲觀鎖定,否則寫入操作不會被阻止。在一個事務中,發生的事情是未提交的對於這個事務之外的任何人都是不可見的(假設默認隔離級別爲READ_COMMITTED)。正如你所提到的save()get()運行在不同的線程,因此不同的交易,這一切都取決於get()時是否提交save()的事實。