带有NHibernate和quartz事务的Spring.NET(全局事务管理器)

时间:2014-04-22 05:19:33

标签: spring nhibernate transactions quartz-scheduler spring.net

我想在我的服务层使用Global transaction manager。

例如

namespace AssemblyName.Core.Service.Implementation
{
    public class DemoService
    {

      public void demo() 
      {
           save(model); //This is nHibernate transaction
           SchedulerManager.GetInstance.save(id); //This is related to quartz.  
      }
    }       
}

我应该使用什么?

如果我使用TransactionScope(),那么它会给我错误,因为NHibernateTransaction无法提交。

我用过

<object id="transactionManager"
    type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate33">

    <property name="DbProvider" ref="DbProvider"/>
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>

</object>

在我的sprin.config文件中。

编辑: 然后我在spring.config文件中使用了两个事务管理器:

<object id="transactionManager"type="Spring.Data.NHibernate.HibernateTransactionManager,Spring.DataNHibernate33">
        <property name="DbProvider" ref="DbProvider"/>
        <property name="SessionFactory"ref="NHibernateSessionFactory"/>
 </object>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>
        <tx:method name="*"/>
     </tx:attributes>
</tx:advice>

<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut,Spring.Aop">
      <property name="pattern" value="AssemblyName.Core.Service.Implementation.*"/>
 </object>



<object id="transactionManagerGLobal" type="Spring.Data.Core.TxScopeTransactionManager, Spring.Data">
 </object>

<tx:advice id="txAdviceGlobal" transaction-manager="transactionManagerGLobal">
    <tx:attributes>
       <tx:method name="demo"/>
    </tx:attributes>
</tx:advice>

<object id="serviceOperationGlobal" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
    <property name="pattern" value="AssemblyName.Core.Service.Implementation.DemoService"/>
 </object>


<aop:config>
    <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>
    <aop:advisor pointcut-ref="serviceOperationGlobal" advice-ref="txAdviceGlobal"/>
</aop:config>

然后还得到错误: NHibernate Transaction已断开连接或未连接。

1 个答案:

答案 0 :(得分:0)

最后,我按照以下更改解决了我的问题:

我为NHibernate事务添加了tx注释:

<tx:attribute-driven transaction-manager="transactionManager" proxy-target-type="true"/>

对于全局事务,我已将spring.config文件更改为以下内容并删除了顾问程序&service; ServiceOperation&#39; NHibernate Transaction。:

<aop:config>
<aop:advisor pointcut-ref="serviceOperationGlobal" advice-ref="txAdviceGlobal"/>

我的代码更改:

namespace AssemblyName.Core.Service.Implementation
{          
      public class DemoService
      {
         [Transaction(TransactionPropagation.Required)]
         public void demo()
         {
          save(model); //This is nHibernate transaction
          SchedulerManager.GetInstance.save(id); //This is related to quartz.
         }
       }       
}

编辑:    通过这样做引入其他问题。    它在许多电脑上运行良好,但在某些电脑中显示错误:当我执行与demo()相关的操作时,连接断开或未打开。

我已配置了运行MS DTC所需的所有设置。