首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >长会话的版本并发控制。NHibernate。ASP.NET MVC

长会话的版本并发控制。NHibernate。ASP.NET MVC
EN

Stack Overflow用户
提问于 2012-02-23 07:39:28
回答 2查看 860关注 0票数 1

1)在并发控制方面,哪种方法更合适/更常用?悲观还是乐观锁定?

2)如果项目上有锁,或者是否发生了回滚,我如何通知用户?

3)假设我在实体映射文件中添加了所有需要的标记(比如optimistic-locking="false",以排除我不想参与比较的属性),并在实体类上定义了一个Version属性来处理并发控制。这就足够了吗,所有的东西都是在NHibernate内部/由处理的。还是应该有更多的修改?例如,在Repository

代码语言:javascript
复制
public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
    private ISession session;

    public Repository(ISession session)
    {
        this.session = session;
    }

    public T Get(Guid id)
    {            
        return this.session.Get<T>(id);            
    }
    public IQueryable<T> Get(Expression<Func<T, Boolean>> predicate)
    {
        return this.session.Query<T>().Where(predicate);            
    }
    public IQueryable<T> Get()
    {
        return this.session.Query<T>();            
    }
    public T Load(Guid id)
    {
        return this.session.Load<T>(id);
    }
    public void Add(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Save(entity);
            transaction.Commit();
        }
    }
    public void Remove(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Delete(entity);
            transaction.Commit();
        }
    }
    public void Remove(Guid id)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Delete(this.session.Load<T>(id));
            transaction.Commit();
        }
    }
    public void Update(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Update(entity);
            transaction.Commit();
        }
    }
    public void Update(Guid id)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Update(this.session.Load<T>(id));
            transaction.Commit();
        }
    }
}

// DI
public class DataAccessModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        this.Bind<ISessionFactory>()
            .ToMethod(c => new Configuration().Configure().BuildSessionFactory())
            .InSingletonScope();

        this.Bind<ISession>()
            .ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession())
            .InRequestScope();

        this.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
    }
}

我正在使用一个长会话来处理多个事务。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-23 13:06:56

您的存储库不应该处理事务范围。这是一个完全不同的需求,存储库不知道事务应该有哪些边界。

事务应该由基础结构代码处理。如果您正在使用ASP.NET MVC -动作过滤器是合适的(请参阅实现是夏普架构项目)。

如果它的ASP.NET,那么模块或全局asax处理可以应用。

但是不要在存储库中处理它,它的抽象非常漏,您将需要向调用方公开边界。

票数 1
EN

Stack Overflow用户

发布于 2012-02-24 05:12:56

您在这里缺少"工作单位“模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9408929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档