EntityFrameWork使用TransactionScope分布式事务,存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 错误

最近在开发一个小型的物业管理系统,系统其中有一个功能需要每个月按抄的水表、电表等生成相应的费用,数据库主要的基础数据表有大楼水、电表、楼层水、电表、房间水电表;其中大楼和楼层的水电表是用于计算公摊的;系统设计有一个费用的统计表,表名ChargeAccountMaster,表内设计的有一个字段ID,主键 、 自增长;计算时由于是数据核算统计,所以引入事务计算数据的同时,也会把相应计算的结果回写回基础数据表中,计算的类是service层,框架的ORM用的是EF,就没有采用本地事务,采用了分布式事务TransactionScope,代码如下:

            TransactionOptions transactionOption = new TransactionOptions();

            //设置事务隔离级别
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            // 设置事务超时时间为120秒
            transactionOption.Timeout = new TimeSpan(6000000000);
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                 .....................业务代码
                  scope.Complete();

         }

 最初数据统计写入数据库的场景是,先初始化ChargeAccountMaster 表,对表内的每一个字段的值都进行初始化,插入数据库;然后在计算和统计每一个基础数据表后得出结果再Update该表,在开发的时候,这种方式一直没有出错,直接发布到生产环境,将正式的数据导过来,进行大查的数据核算时结果报错了:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;刚见到这个错误时,头都大了,没有任何的提醒,只好找度娘,找到如下答案:

主键没有赋值,造成数据库的值与程序的主键值的ID没有对应上

通过调试,由于数据库的ID设计为自增,所以在程序时中就没有直接赋值,跟踪到数据插入,发觉自增的ID在EF 第一次 SaveChange()后,是有返回ID的,且插入数据是成功的,但由于数据的错误,事务却未能提交;但第二就插入不成功,就开始报这个错误了。

一直以为大家都写的ID没值,刚好第二次确实没有返回值,一直以为就是ID的问题,就在这上面花了很多时间,调整事务的隔离属性、范围内、把自增的ID改为程序生成写入都没有效果,还是报同样的错误;最后没办法,在想第一交都有值,那么只做一次性插入,不做前面的初始化,初始化的动作在程序上做,每计算完一个基础数据然后直接在程序上更新,最后统一插入和更新数据库,结果却成功了,问题解决了,却找不到出现问题的原因。

个人分析:事务是不是在插入数据后(SaveChange),不允许再对当前的数据进行更新,那么为什么在开发的时候,却没有了出现这个问题?

将问题记录在这,找到问题的原因再来更。。。。。。

时间: 2024-10-18 18:00:17

EntityFrameWork使用TransactionScope分布式事务,存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 错误的相关文章

关于错误:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。

MVC4 在修改实体类报错 报错说明:存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectStateManager 项.     经过检查后,发现是由于数据更新找不到更新项所致,即没有主键   解决方法:为实体主键赋值,这里是表单回传,所以使用了隐藏域回传方式   以上两种方式,哪一种都可以

[Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。

学习asp.net mvc 时在更新实体进行SaveChanges()的时候出现了异常,异常如下: “/”应用程序中的服务器错误. 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectStateManager 项. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Data.Entity.Core.OptimisticConcurrency

计算密集型分布式内存存储和运算平台架构

避嫌声明:所有图文都是根据自己的理解原创,且已离开这家公司三年以上,不存在保密协议,写此文只是用来分享知识.探究不足. 牢骚:本来想弄个ppt交互展示的,不过我的js权限还没批... 1. 相关概念 1.1 内存数据库 关系型数据库处理永久.稳定的数据,内存数据库就是将其数据放在内存中,活动事务只与内存数据打交道,重新设计了体系结构并且在数据缓存.快速算法.并行操作方面也进行了相应的改进,所以数据处理速度比磁盘数据库要快很多,一般都在10倍以上.但它不容易恢复,可能暂时不一致或非绝对正确的,要求

常用的分布式事务解决方案

众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行.这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务.但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为"分布式事务".那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事务解决方案.废话不多说,那就开始吧-

搞懂分布式技术17,18:分布式事务总结

搞懂分布式技术17:浅析分布式事务 众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行.这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务.但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为"分布式事务".那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事

从本地事务到分布式事务到微服务下事务

从本地事务到分布式事务到微服务下事务 一.传统本地事务 传统单服务器,单关系型数据库下事务比较简单,完全可用很简单的实现ACID,实际中我们实现一个业务时只需要:开启一个事务-操作数据库-提交/回滚这个事务,这样就完美的实现了一次事务操作,更简单点我们通常会通过spring集成事务直接指定在哪些服务什么样的方法执行什么样的事务即可,更甚至我们业务实现基本都忽略了事务,具体图如下: 二.传统分布式事务 在传统一服务,一个关系数据库架构基础上,随着访问量的增大,单机很明显已满足不了现状,于是我们顺其

OceanBase 1.0 的分布式事务

OceanBase 1.0 的分布式事务 数据库的功能强大而繁杂,其中,“事务(Transaction)”是使用者不自觉就会用到的功能.作为开发数据库的工程师,我们是倾注了大量的精力和时间在事务这个功能上,并且深知数据库系统实现事务是付出了很大代价的.这代价不仅包括数据库软件开发的工作,而且还包括数据库运行过程中的代价.换句话说,在其他情况不变的时候,如果数据库放弃事务功能,能获得更好的性能.在数据库软件刚出现时,并没有事务这个功能,但这种情况下,使用数据库开发软件很多时候无法保证数据的正确性和

spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理

转载自:http://blog.csdn.net/liaohaojian/article/details/68488150 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做: 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整

分布式事务解决方案框架(LCN)

事物概念 事物特性(ACID) 原子性(A) 所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样. 一致性(C) 事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元. 隔离性(I) 所谓的隔离性就是说,事务与事务之间不会互相影