2011-10-09 33 views
0

我剛剛遇到了一個我通過Spring調用的Quartz作業的問題。我的ExecuteInternal方法有一個[Transaction]屬性(因爲它負責DB調用),但是當它運行時,我得到'沒有NHibernate會話綁定到線程'的錯誤。Spring.NET,Quartz&Transactions

只是想知道,如果那是因爲Spring.NET不支持在石英對象[Transaction]屬性?

如果不是,那很好......我可以手動啓動交易,但要檢查它的情況下,而不是在我的配置一個愚蠢的錯誤的地方。

[更新] 我明白其實。在API文檔中,它表示最好的方法是使用服務層上的事務。我的工作是使用DAO來完成它的工作,但是我的事務處在我的服務層上,所以我只是從我的工作中調用服務方法,而不是爲了做同樣的工作(保存,更新記錄等),因爲它們已經存在。

它也表明,如果你給SchedulerFactoryObject一個DbProvider,你可以在作業本身中使用事務,但是當我這樣做時,它似乎想要在DB中的特殊表中找到我的觸發器(我沒有因爲我的觸發器全部都是XML格式,所以這可能是另一種方法。

調用服務的方法對我來說工作正常不過。

+0

你可以回答你自己的問題,接受你自己的答案。這樣大家都知道你問題解決了。 – Marijn

+0

會做。我必須等待8個小時,顯然...... – Richard

回答

2

事務屬性使用AOP的作品。 Spring.NET爲裝飾物創建一個aop 代理。此代理創建會話並啓動事務。

ExecuteInternal方法,你不叫上的代理方法,但對目標本身。因此,春天不能攔截呼叫,並執行其交易魔術。

您服務注入,因此事務屬性爲他們工作。

有對這個問題的春天文檔一個很好的解釋:http://www.springframework.net/doc-latest/reference/html/transaction.html#tx-understandingimpl