2
如果兩個事務(都在RR隔離級別)請求第二級高速緩存的相同項目,然後他們修改並存儲此項目。現在,爲了閱讀該項目,他們沒有運行任何SQL,因爲它被緩存;所以在這種情況下,他們真的會啓動一個數據庫事務嗎?當他們提交更改時,他們是否會遇到丟失更新問題?休眠二級緩存和RR事務隔離
如果兩個事務(都在RR隔離級別)請求第二級高速緩存的相同項目,然後他們修改並存儲此項目。現在,爲了閱讀該項目,他們沒有運行任何SQL,因爲它被緩存;所以在這種情況下,他們真的會啓動一個數據庫事務嗎?當他們提交更改時,他們是否會遇到丟失更新問題?休眠二級緩存和RR事務隔離
從一個悲觀點:
如果第二級高速緩存被配置爲參與交易,那麼只有第一獲取了寫鎖定將能夠修改高速緩存的對象的一個,然後寫對數據庫的更改。當第二個事務想要獲得寫入鎖時,它必須等到第一個事務結束並釋放它。
通過樂觀鎖定,我猜應該發生併發修改異常(或類似名稱),第二個事務會重試該操作。
假設緩存是可讀寫的。事務將不會獲得數據庫中的共享讀鎖,因爲他們永遠不會去數據庫讀取數據。假設t1先更新,那麼它會鎖定對象,獲取數據庫寫入鎖定,更新數據庫並釋放數據庫寫入鎖定和對象鎖定; t2然後鎖定對象,獲取數據庫寫入鎖定,更新數據庫並釋放數據庫寫入鎖定和對象鎖定。那麼t2不會覆蓋t1的變化嗎?那麼即使隔離級別是RR,我們也不會丟失更新嗎? – shrini1000 2012-04-05 16:45:17
在你提到的例子中,t1先寫入然後寫入t2。當t2讀取BEFORE t1改變的值之後寫入失敗更新問題。在你的例子中,沒有事務讀取任何東西,他們只寫。如果t2在t1更新之前讀取了值,則t1將無法執行更新,因爲t2有讀鎖。寫鎖定不能與讀鎖共享。 – Luciano 2012-04-05 17:21:48
那麼,因爲它們都從緩存中讀取,它們將獲得相同的值。所以t2會在t1寫入之前讀取該值。然後t1寫入它,然後t2寫入它。由於他們沒有使用任何共享讀鎖(因爲該值來自緩存而不是數據庫),這不會導致t1的丟失更新嗎? – shrini1000 2012-04-06 03:53:51