我刚刚遇到一个我正在通过Spring调用的Quartz作业的问题。我的ExecuteInternal
方法有一个[Transaction]
属性(因为它会加载一些DB调用),但是当它运行时,我得到'No NHibernate session to thread to thread'错误。
只是想知道是不是因为Spring.NET不支持Quartz对象中的[Transaction]
属性?
如果没有,那很好......我可以手动启动一个事务,但是想检查是否是这种情况,而不是在我的配置中的某个地方出现愚蠢的错误。
[更新] 我实际想出来了。在API文档中,它说最好的方法是在服务层上使用事务。我的工作是使用DAO来完成它的工作,但是我的交易在我的服务层上,所以我只是从我的工作中调用服务方法而不是做同样的工作(保存,更新记录等),因为它们已经存在。
它还建议如果你给SchedulerFactoryObject一个DbProvider,你可以在作业本身使用事务,但是当我这样做时,似乎想要找到我在DB中的特殊表中配置的触发器(我没有'设置因为我的触发器都是XML格式的,但这可能是另一种方法。
调用服务方法对我来说很好。
答案 0 :(得分:2)
事务属性使用aop工作。 Spring.NET为装饰对象创建了一个代理。此代理创建会话并启动事务。
在ExecuteInternal
方法中,您不会在代理上调用该方法,而是在目标本身上调用该方法。因此,春天不能拦截召唤并做其交易魔术。
您的服务已注入,因此交易属性适用于他们。
关于这个主题的春季文档有一个很好的解释:http://www.springframework.net/doc-latest/reference/html/transaction.html#tx-understandingimpl