a1ding2 2014-02-24 04:32 采纳率: 0%
浏览 916

NHibernate缓存的问题

问题是这样的,关于一个新增model的方法,代码如下:
ISession session = null;
try
{
session = NHibernateHelper.GetCurrentSession();
session.Evict(model);
session.Save(model);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (session != null)
session.Flush();
}
我新增一个model,由于我的id不是自动增长的,因此我新增model的时候需要手动设置一个id。因此当我新增一个model,model的id跟数据库中的某个id重复的时候,他就会报错,说id重复。但是当我更改了一下id再次新增model(此时id跟数据库中不重复)的时候,他还是报id重复的错误。查看log中的sql语句发现sql语句跟之前的sql语句一样id并没有更改。而如果第一次新增model的时候,如果这个id跟数据库中的id不重复,则不会报该错误。并且以后新增model 的时候那个log中的sql语句也没有跟上次的id重复。
我当时第一个想法是缓存,于是我通过 session.Evict(model);清除这个model 的缓存,但是没有效果。于是我换了session.Clear();这次是正确了,但是这样就清除了所有的缓存。请问有没有什么好的办法解决这个问题呢?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-01 19:10
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题可能是因为你的缓存策略与你的事务处理方式不匹配导致的。在NHibernate中,你可以使用TransactionScope来管理事务,并且可以使用session.Transaction.IsolationLevel属性来指定事务隔离级别。以下是一个示例:

    using (var scope = new TransactionScope(TransactionScopeOption.Required))
    {
        // 在这里添加你对模型的操作
        var model = ...;
        // 保存到数据库
        session.Save(model);
    }
    

    然后,在finally块中,确保关闭事务:

    try
    {
        // 任何可能会修改状态的操作
    }
    catch (Exception)
    {
        // 如果出现异常,确保关闭事务
        if (session != null && !string.IsNullOrEmpty(session.CurrentTransaction?.Id))
        {
            session.Dispose();
        }
    }
    

    这将确保无论发生何种情况,事务都会被正确地关闭,从而避免了意外的缓存更新。

    评论

报告相同问题?