我想在我的服务层使用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已断开连接或未连接。
答案 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所需的所有设置。