2012-02-18 17 views

回答

1

基本上,當您的事務提交時,它被存儲到數據庫中。

隨着CMP你可以在deplyment描述與事務劃分控制這個網HRS歐洲

<ejb-jar> 
... 
<assembly-descriptor> 
... 
<container-transaction> 
<method> 
<ejb-name>EmployeeRecord</ejb-name> 
<method-name>*</method-name> 
</method> 
<trans-attribute>Required</trans-attribute> 
</container-transaction> 
<container-transaction> 
<method> 
<ejb-name>EmployeeRecord</ejb-name> 
<method-name>updatePhoneNumber</method-name> 
</method> 
<trans-attribute>Mandatory</trans-attribute> 
</container-transaction> 
... 

這是規範中的一個片段http://download.oracle.com/otn-pub/jcp/ejb-2.1-fr-spec-oth-JSpec/ejb-2_1-fr-spec.pdf

當你調用EJB新的交易方法可能由容器啓動,具體取決於您的分界線,並且如果方法成功終止,則交易可能會被執行,具體取決於這個和那個。例如,如果您的具體方法是按新要求劃分的,那麼它將被提交,因爲它具有它自己的事務,但是如果它與需求劃分並且在一個正在運行的事務中被調用(例如因爲它被調用從一個會話bean方法中分離出來,比如說,要求或者需要 - 新的),它會在提交封閉事務時被提交。或者如果失敗,不僅在該方法內所做的更改將被回滾,而且還會在封閉的方法調用/事務內進行更改。

儘管部署描述符可能允許嵌套事務,但它實際上歸結爲數據庫引擎最終如何處理事務。很多時候,rdbms並不真正支持嵌套事務,而是使用事務保存點,所以從ejb-perspective看來,遞歸的實際情況可能實際上是以數據庫中的「線性」方式發生的。但是在大多數情況下,結果是一樣的。

考慮事務隔離級別也可能是相關的。

+0

因此,如果服務器在提交事務之前崩潰,那麼實體狀態會丟失? – seahorse 2012-02-18 11:01:42

+1

@seahorse是的,除非它存儲在別處。從規範(再次):如果在容器崩潰時實體的狀態由事務更新,則實體的狀態會自動重置爲上次提交的事務的狀態。 – 2012-02-18 11:48:55

1

確保bean事務在事務提交時保存到數據庫中。通常情況下,容器會在保存狀態之前等待提交時間,以便在事務回滾的情況下避免不必要的更新,或者在單個事務中多次修改狀態。

該規範還指出,容器必須確保通過在同一事務中執行的EJBQL查詢,對實體bean所做的修改是可見的。這意味着在執行EJBQL查找器之前,修改將保存到數據庫中。

+0

如果查詢在與更改相同的會話/連接內運行,即使尚未提交更新,它們對於該查詢也是可見的。該會話/事務外部可見的內容取決於事務隔離級別。 – 2012-02-18 10:57:05

相關問題