簡體   English   中英

Seam @Transactional注釋不起作用?

[英]Seam @Transactional annotation not working?

我在接縫組件上使用@Transactional注釋類似於:

@Name( "myComponent" )
@AutoCreate
public class MyComponent
{
    public void something() {
        ...
        doWork();
    }
    ...
    @Transactional
    protected void doWork() {
        try {
            log.debug( "transaction active: " + Transaction.instance().isActive() );
        } catch (Exception ignore) {}

        // some more stuff here that doesn't appear to be inside a transaction
    }
}

在“更多東西”部分,我正在修改一些Hibernate實體,然后有一個錯誤,拋出異常。 我注意到Exception沒有導致事務被回滾(修改后的實體仍在db中被修改)所以我添加了“事務活動”日志記錄。 執行此代碼時,isActive()返回false。

有什么我想念的嗎? 為什么交易不活躍?

如果它很重要,我正在使用另一個使用RESTEasy注釋的組件內部的Seam組件來觸發我的方法調用。

我不熟悉Seam是如何工作的,所以如果這個答案不適用,我會提前道歉。

我注意到@Transactional的方法protected 這意味着它被另一個內部方法調用。

使用Spring的AOP,您可以使用@Transactional標記公共方法,這些方法將被包裝並替換為事務代理。 當外部類調用public方法時,它調用構成事務的代理。 如果外部類調用另一個使用@Transactional標記的public方法,然后調用內部方法,則不會創建任何事務,因為根本沒有調用代理。

在Spring中,即使您將doWork()方法更改為公共方法,也會發生同樣的問題。 沒有事務,因為沒有調用代理對象。 在類內部進行的方法調用不會調用代理對象。

快速閱讀一些文檔似乎表明,像Spring AOP一樣,Seam正在使用CGLib代理 問題是它是否能夠代理所有方法 - 即使它們是從代理對象中調用的。 很抱歉,如果此答案不適用,請浪費您的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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