在默認的JEE容器管理環境中,只有企業bean(通常爲@Stateless
beans被使用)是事務性的。一旦你從外面輸入這樣一個bean,交易將被打開。通過@javax.transaction.Transactional
註釋,您可以控制事務的行爲,但在默認情況下這不是必需的。
例豆:
@Stateless
public MyBean {
public void withinTransaction() {
System.out.println("i'm running within a transaction");
}
@Transactional(TxType.NOT_SUPPORTED)
public void outsideTransaction() {
System.out.println("no transaction available...");
}
}
- 如果調用從Servlet
MyBean.withinTransaction
(例如,經由REST),一個新的事務被創建(如果尚未存在)。
- 如果您致電
MyBean.outsideTransaction
,則不會創建任何交易。
- 如果你調用從
withinTransaction
this.outsideTransaction()
,你仍然有可交易的outsideTransaction
(因爲攔截器只綁定到bean邊界)
- 如果從
outsideTransaction
調用this.withinTransaction()
沒有新的交易產生(因爲攔截器只有綁定到豆邊界)
- 如果
outsideTransaction
將是第二個bean AnotherBean
,這@Inject
小號MyBean
的一部分,你叫MyBean.withinTransaction
,然後一個新的事務將被創建(如果尚未存在)。因爲你跨越了AnotherBean.outsideTransaction
和MyBean.withinTransaction
之間的bean邊界。
我覺得自己沒有足夠的細節這個問題得到比如何建立與數據庫連接的應用程序完全JEE教程更好的答案。這超出了StackOverflow範圍。你可以縮小你的問題嗎?比如你問「有沒有配置丟失」,而沒有提及你實際擁有的配置。或者粘貼任何可以告訴我們的代碼,如果你正在做你說的正確的事情。 – Deltharis
您是否做過任何會禁用自動交易的功能? –
我們需要知道你在哪裏放置@Transactional註釋。請分享您的代碼。你不需要任何攔截器,因爲'@Transactional'已經是攔截器綁定了。 – Rouliboy