2011-10-09 35 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