[英]Debugging transactions in Java EE
我有一個@Stateless EJB方法,其中
remove()
從數據庫中刪除一些條目 @ApplicationException(rollback=true)
的異常 我沒有該方法的其他特定於事務的注釋(我設置了@TransactionAttribute(TransactionAttributeType.REQUIRED)
但無論如何應該是默認注釋!)。 事務由容器管理。 JPA提供者是EclipseLink。
而且,拋出異常時,事務不會回滾。 例如。 在回滾之前我從數據庫中刪除的條目不會返回。 順便說一句。 我在拋出之前調用entityManager.flush(),它會導致這種行為嗎(應該不會)?
我也嘗試調用SessionContext.setRollbackOnly()
,結果相同。
如何調試此問題?
我正在使用Glassfish v3和Netbeans進行調試,但是我對println感到同樣滿意,我只是不知道將它們放在哪里...
我有一個@Stateless EJB方法,其中(...)
只是為了澄清您如何獲得EntityManager?
(...)我設置了@TransactionAttribute(TransactionAttributeType.REQUIRED
確實,這是默認設置,無論如何都不應該要求。
而且,拋出異常時,事務不會回滾。 例如。 在回滾之前我從數據庫中刪除的條目不會返回。
嗯,這是非常奇怪和意外的。
順便說一句。 我在拋出之前調用entityManager.flush(),它會導致這種行為嗎(應該不會)?
不,沖洗!=提交
我也嘗試調用SessionContext.setRollbackOnly(),結果相同。
好吧,仍然是意料之外的(但至少是一致的...)。
我正在使用Glassfish v3和Netbeans進行調試
也許激活以下類別的日志記錄(例如,通過“管理”>“配置”>“日志記錄”>“日志級別”下的日志)來查看是否可以發現任何奇怪的東西:
作為一種替代方法(一種“窮人的日志記錄”),您可以實現SessionSynchronization
來獲取有關事務的通知。
真的很奇怪的問題...
除了Pascal的良好答案之外,還需要檢查一些事情...如果滿足以下任一條件,則保證您的EntityManager
不參與容器管理的事務:
transaction-type="RESOURCE_LOCAL"
要檢查的輔助事項:
<jta-data-source>
填寫在persistence.xml中 <jta-data-source>
引用<jta-data-source>
已設置為參與JTA事務(自動提交已關閉) 后兩者在某種程度上是特定於供應商的,因為如果未指定<jta-data-source>
則某些供應商會自動填寫。 同樣,如果<jta-data-source>
指向未設置為參與JTA事務的數據源(該設置是特定於供應商的),則某些部署將失敗。 不確定Glassfish如何處理這兩個項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.