2011-04-22 48 views
3

交易是在典型的服務級別定義的。Spring&JDBC事務:如何確保DAO對象中的隔離級別SERIALIZABLE?

但有時我們有一個DAO方法需要更高的SERIALIZABLE隔離級別。

但是對於是否需要SERIALIZABLE隔離級別的知識封裝在DAO方法中,服務方法不需要知道這一點。

如何在DAO方法級別執行SERIALIZABLE隔離級別?我什至不能找到一種方法來確定什麼隔離級別是在春天。

回答

1

服務層通常定義事務語義。

但是......你可以添加following annotation實現對DAO方法實行的序列化隔離級別達到的效果:

@Transactional(isolation=Isolation.SERIALIZABLE,propagation=Propagation.MANDATORY) 

強制性的,這樣的DAO方法不會產生某個事務不存在。這將強制所有調用從服務方法開始。如果需要,你可以改變它。

讓我知道它是如何工作的。

+0

我還沒有做過測試,但是我在TransactionDefinition的文檔中注意到了這個註釋:「請注意隔離級別和超時設置不會被應用,除非實際的新事務開始。從那以後,我會猜想,不允許在中游改變隔離水平,但也許我只是從背景中讀出來。任何想法? – 2011-04-22 18:30:27

+0

剛做了測試。隔離級別仍設置爲DAO方法內的READ COMMITTED,並按照您所描述的設置@Transactional進行設置。 JDBC語句javadocs還聲明隔離級別只能在事務啓動時設置,而不能在事務之後設置。現在我剛剛創建了一個檢查隔離級別的方法,如果它不是SERIALIZABLE,則會引發RuntimeException。但是這需要額外訪問數據庫來查詢當前的隔離級別。 – 2011-04-25 14:41:22

+0

爲什麼不使用propagation = REQUIRES_NEW? http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/annotation/Propagation.html#REQUIRES_NEW – les2 2011-04-25 20:11:44