簡體   English   中英

在Java EE中調試事務

[英]Debugging transactions in Java EE

我有一個@Stateless EJB方法,其中

  1. 使用JPA remove()從數據庫中刪除一些條目
  2. 引發一個注釋為@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進行調試

也許激活以下類別的日志記錄(例如,通過“管理”>“配置”>“日志記錄”>“日志級別”下的日志)來查看是否可以發現任何奇怪的東西:

  • javax.enterprise.system.core.transaction
  • javax.enterprise.resource.jta
  • javax.enterprise.system.container.ejb

作為一種替代方法(一種“窮人的日志記錄”),您可以實現SessionSynchronization來獲取有關事務的通知。

真的很奇怪的問題...

也可以看看

除了Pascal的良好答案之外,還需要檢查一些事情...如果滿足以下任一條件,則保證您的EntityManager 參與容器管理的事務:

  • 您通過EntityManagerFactory創建了EntityManager
  • 您在persistence.xml中指定了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM