gpt4 book ai didi

nhibernate - 为什么OnPostUpdate中的Session.Evict导致 "Possible nonthreadsafe access to session"异常?

转载 作者:行者123 更新时间:2023-12-03 16:45:00 28 4
gpt4 key购买 nike

我有一个具有多个角色的用户。使用链接实体表将用户链接到角色。我已将配置文件设置为在删除用户时级联删除用户角色链接实体。

我们目前正在使用软删除来删除实体。我们添加了一个由删除触发的软删除事件监听器。删除实体时,它将触发DeleteEntity事件,该事件将实体标记为已删除。

我们还重写了OnPostUpdate事件,以通过在实体上调用Evict从缓存中删除实体。

如果我创建一个没有任何角色的用户,然后删除它,则一切正常(如果禁用了层叠,它也可以工作)。但是,如果我为用户分配了至少一个角色,并且删除了该用户,则在OnPostUpdate中调用Evict之后,我会收到NHibernate异常“NHibernate.AssertionFailure:可能对 session 进行非线程安全访问”。

我已尝试在OnPostUpdate中使用子 session 来退出实体,但不会引发异常,但是不会退出实体。

public void UserDelete(.....)
{
var user = repository.Fetch<User>(id);

repository.Remove(user);
repository.Connection.Commit();
}


// soft delete event listener
protected override void DeleteEntity(NHibernate.Event.IEventSource session, object entity, ..)
{
var repositoryEntity = entity as deletableentity;
if (repositoryEntity != null)
{
if (!repositoryEntity.IsDeleted)
{
// this marks the entity as deleted
repositoryEntity.isDeleted = true;

// cascade delete
this.CascadeBeforeDelete(session, persister, repositoryEntity, entityEntry, transientEntities);
this.CascadeAfterDelete(session, persister, repositoryEntity, transientEntities);
}
}
}

public void OnPostUpdate(PostUpdateEvent @event)
{
if (@event == null) throw new ArgumentNullException("event");

var entity = @event.Entity as deletableentity;

// Evict any entities that have been set as deleted from first level cache.
if (entity != null && entity.IsDeleted)
{
@event.Session.Evict(entity);
}
}

关于如何解决的任何想法?

最佳答案

根据https://forum.hibernate.org/viewtopic.php?p=2424890的另一种避免这种情况的方法是基本上调用

          session.save(s);
session.flush(); // allow evict to work
session.evict(s);

并且问题的根源是“如果我从缓存中逐出实体,则commit()不会在那里找到它”(即,这根本不是线程安全问题,这是缓存被修改的问题)。

关于nhibernate - 为什么OnPostUpdate中的Session.Evict导致 "Possible nonthreadsafe access to session"异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726413/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com