顶者有分!NHibernate因为一级缓存,导致数据不一致的问题!
假设有两表表
表1 用户表(UserTable) 两个字段 “UserID”为主键
UserID UserName
U001 x某
表2 地址表(AddressTable) 三个字段 “AddressID”为主键 “UserID_fk”为外键,对应上“UserTable”的主键
AddressID UserID_fk AddressDetial
A001 U001 xx省XX市
视图(VUser) 就是把用户和地址连起来
SELECT [UserID],[UserName],[AddressDetial] FROM [UserTable] LEFT JOIN [AddressTable] ON [UserID_fk]=[UserName]
其中视图(VUser)是为了方便完整的信息在列表上显示,也方便多表多条件查询,读取方式就是把视图也当成一个表,创建了一个实体
现在问题出来了
问题1:
> 先用视图查出了一行记录(为了简单,假设就一条记录)
> 然后我用“Get()”和“Update()”更新了UserTable这条记录的UserName(比如由“x某”改为“y某”)
> 然后我刷新列表(列表是由视图出来的,所以和“Update()”的不是一个实体),列表不更新,因为被一级缓存了
各位有什么好的办法解决吗?
表1 用户表(UserTable) 两个字段 “UserID”为主键
UserID UserName
U001 x某
表2 地址表(AddressTable) 三个字段 “AddressID”为主键 “UserID_fk”为外键,对应上“UserTable”的主键
AddressID UserID_fk AddressDetial
A001 U001 xx省XX市
视图(VUser) 就是把用户和地址连起来
SELECT [UserID],[UserName],[AddressDetial] FROM [UserTable] LEFT JOIN [AddressTable] ON [UserID_fk]=[UserName]
其中视图(VUser)是为了方便完整的信息在列表上显示,也方便多表多条件查询,读取方式就是把视图也当成一个表,创建了一个实体
现在问题出来了
问题1:
> 先用视图查出了一行记录(为了简单,假设就一条记录)
> 然后我用“Get()”和“Update()”更新了UserTable这条记录的UserName(比如由“x某”改为“y某”)
> 然后我刷新列表(列表是由视图出来的,所以和“Update()”的不是一个实体),列表不更新,因为被一级缓存了
各位有什么好的办法解决吗?
...全文
相关推荐
第7章NHibernate事务、并发和缓存[借鉴].pdf
- **悲观锁**:锁定数据,直到事务结束。这种方式可能会导致性能下降,但在某些情况下可以避免脏读等问题。#### 四、NHibernate缓存机制缓存是提高应用程序性能的关键手段之一。
高级缓存应用:NHibernate与***案例分析
本文还有配套的精品资源,点击获取 简介:NHibernate和 是.NET开发中重要的ORM和DI框架。本案例演示了如何结合这两个框架,特别是通过 集成SysyCache实现二级缓存。案例详细讲解了NHibernate的对象关系映射功能、一级和二级缓存的工作原理、缓存策略和更新机制,以及 的依赖注入和事务管理功能。通过本案例的学习...
NHibernate.CacheDb:使用 NHibernate 和 Intersystems 数据库缓存的解决方案
然而,缓存的使用需要谨慎,避免因缓存引发的新问题,例如数据一致性问题和内存管理问题。在实际项目中,应根据具体需求和环境进行细致的测试和调优。
NHibernate事务、并发和缓存
NHibernate事务管理**在数据库操作中,事务是确保数据完整性和一致性的基础。NHibernate支持三种事务管理模式:自动提交、显式事务和程序化事务。
NHibernate4.0数据库操作完整代码
二级缓存可以进一步优化性能,尤其是在高并发场景下,减少对数据库的访问压力。需要注意的是,二级缓存的使用需要谨慎,因为它可能会引发数据一致性问题,尤其是在多线程环境中。


