`
jackchen0227
  • 浏览: 143389 次
  • 性别: Icon_minigender_1
  • 来自: 帝都
社区版块
存档分类
最新评论

ChangeConflictException: Row not found or changed

阅读更多

 

    今天做一个datagrid,数据源是asp:ObjectDataSource。做datagrid的删除按钮的时候,总是提示出现ChangeConflictException: Row not found or changed。单步跟踪的时候,发现别的执行都是正常的,就是在SubmitChanges(),提示出错,参考下文解决问题

前段时间工作中的一个新需求,有机会用到了Linq to SQL。使用后的第一感觉,就是方便很多,也为整个项目节约了一大把的开发时间,甚至代码量也少了很多。不过在程序的实际运行中,始终会遇到一些莫名其妙的异常,最令人不解的,就是“System.Data.Linq.ChangeConflictException: Row not found or changed.” 。当初凭自己和同事的判断,可能是数据库的数据异常所导致,后来发觉这个异常出现得越来越频繁,于是上MSDN查了查,原来是Linq中一个常见的问题:更新冲突。
   这个词说起来比较玄乎,其实再平常不过了。下面可以通过一个简单的例子,来重现这个异常。
   建立一个普通的测试表:LinqTest(如图)

  

     在测试表中,插入一条测试数据(如图)

    

     测试代码如下:

  
 程序代码

namespace LinqTest
{
    class Program
    {
        static void Main(string[] args)
        {
            
            TestDataContext db = new TestDataContext();

            db.Log = Console.Out;
            var result = from p in db.LinqTests
                         where p.ID == 1
                         select p;

            var info = result.FirstOrDefault();
            
            if(info != null)     //插入断点
            {
                info.Age = 25;
                db.SubmitChanges();
            }

            Console.ReadLine();

        }

    }

}
 
    


    在测试代码中,将DataContext的日志定向到Console的输出部分,这样方便我们观察Linq实际执行的SQL语句是什么。重现的时候,我们需要在注释的地方,插入断点进行测试。对于示例中的代码,在正常情况下,是不会有错误的。执行过后,我们可以在Console的输出中,看到实际执行的SQL语句(如图)



   再进行第二次调试,首先,恢复Age的数据到以前的样子。下面我们运行到断点处,然后偷偷去SQL Server Management Studio中,手动修改数据,将原始数据中的Age,由24,改为22。然后回到VS2008的IDE,按F5继续运行程序,这个时候,你会发现异常出现了(如图)



    再回到Console的输出,查看,执行的SQL语句和刚才的一样。这就是问题的所在,在正常运行状态下,Linq在运行时,会把数据库的数据缓存到实体对象中,这是一种理想化的情况,并且在更新时,Linq会默认把除更新字段外的所有字段,作为Update语句中的Where条件。但是,如果此时有另外的程序,在访问数据库,并修改数据库数据的时候,比如刚才把Age改为22。此时Linq缓存起来的数据和实际数据库中的数据产生了不一致的情况。Linq此时仍然把被修改过的字段,作为Update的Where条件,但是数据库中Age早就被我们改过了,不再是25,Where条件始终匹配不到原有的数据。这时,就会抛出所谓的:“System.Data.Linq.ChangeConflictException: Row not found or changed.”异常。

    产生此异常,主要是Linq缓存数据和实际数据库数据不一致的情况造成。解决次问题的情况,主要有几种:

    1.比较简单的方法,不使用Linq提供的SubmitChanges()方式提交更改,而直接执行SQL语句,例如:
     db.ExecuteCommand("Update [dbo].[LinqTest] SET Age=25 Where ID = @p0", 1);
    这样虽然比较方便,但是感觉又回到了直接写SQL的时代,毕竟Linq to SQL的目的,就是为了让我们看不见SQL,避免写复杂的SQL语句,而直接操作实体对象,这样也可以避免程序可读性差、不便于维护。所以除非万不得已,还是不太推荐使用此方法。

    2.参考MSDN的资料,采用Linq提供的解决更新冲突的方法,在异常中捕获冲突,然后手动解决冲突:
 程序代码
  
try
{
    db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
}
catch (System.Data.Linq.ChangeConflictException ex)
{
    foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)
    {
         //以下是解决冲突的三种方法,选一种即可

        // 使用当前数据库中的值,覆盖Linq缓存中实体对象的值
        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
        
        // 使用Linq缓存中实体对象的值,覆盖当前数据库中的值
        occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
        
        // 只更新实体对象中改变的字段的值,其他的保留不变
        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
    }

    // 这个地方要注意,Catch方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值   
 //才会提交到数据库。
    db.SubmitChanges();
}
 


    3. 这个方法也比较简单,也即MSDN中所说的Pessimistic Concurrency Control  。 我们可以来设定哪些字段需要放入Where条件,哪些字段不需要,这样就可以控制更新时候的条件匹配尺度。具体做法,就是在Linq to SQL Designer中,把一些字段的UpdateCheck属性设置为Never,这样,这些字段在更新的时候,就不会再出现在Where条件中了。其实比较推荐的做法,就是在表中设立主键,因为更新的时候,只要把主键作为Where条件,就可以单独的确立一行数据了。把除主键外的字段属性中UpdateCheck设置为Never即可。
分享到:
评论

相关推荐

    基于Springboot + Mybatis框架实现的一个简易的商场购物系统.zip

    基于springboot的java毕业&课程设计

    用于 CNO 实验的 MATLAB 脚本.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于卷积神经网络的垃圾分类.zip

    卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    基于 Yolov5的检测模型

    运行程序 1、测试.pt模型文件 1.在pycharm里打开下载的yolov5环境,在根目录打开runs文件,找到trains文件中的best_1.pt即为训练最优模型。 2.在根目录找到 detect.py 文件,修改代码221行默认路径至模型路径,222行路径更改至所需测试图片路径,点击运行。 2、测试.onnx模型文件 1.在pycharm里打开下载的yolov5环境,在根目录打开 export.py 文件,修改默认输出模型类型为onnx,选择best_1.pt输入模型,点击运行。 2.在根目录找到detect_onnx.py文件,修改代码221行默认路径至模型路径,222行路径更改至所需测试图片路径,点击运行。

    郁郁苍苍---基于SpringBoot的多人社区项目.zip

    基于springboot的java毕业&课程设计

    华为FusionAccess桌面云解决方案基于华为FsionCompute云平台的一款虚拟化桌面应用

    华为桌面云解决方案 桌面云架构VDI和IDV VDI:虚拟桌面架构。特点是计算和数据都在云端,集中管理,集中运行。 IDV:智能桌面虚拟化。特点是镜像集中管理,计算和数据还是在终端,集中管理,分散运行。 (从方案的主推厂商看, 业界华为、思杰、Vmware(IDC国内桌面云市场份额排名前三)都主推VDI,目前推IDV架构的只有锐捷、噢易等少数国内厂商)

    一个基于SpringBoot+Editor.md的 API接口文档.zip

    基于springboot的java毕业&课程设计

    基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip

    基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip基于Op

    课设毕设基于SSM的知识产权管理系统源码可运行.zip

    课设毕设基于SSM的知识产权管理系统源码可运行.zip

    基于卷积神经网络的人脸识别.zip

    卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    基于springboot-mqtt的温度、湿度、六氟化硫浓度实时监控系统.zip

    基于springboot的java毕业&课程设计

    房地产企业财务风险的成因与防范对策-以万科集团为例.docx

    房地产企业财务风险的成因与防范对策-以万科集团为例.docx

    基于SpringBoot框架的中小企业完全开源的ERP.zip

    基于springboot的java毕业&课程设计

    基于springboot的动漫弹幕网站.zip

    基于springboot的java毕业&课程设计

    基于SpringBoot + Vue的电影售票及影院管理系统.zip

    基于springboot的java毕业&课程设计

    基于Python+定向爬虫的商品比价系统的实现的设计与实现+详细文档+全部资料(高分毕业设计).zip

    基于Python+定向爬虫的商品比价系统的实现的设计与实现+详细文档+全部资料(高分毕业设计).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。基于Python+定向爬虫的商品比价系统的实现的设计与实现+详细文档+全部资料(高分毕业设计).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求。

    MySQL8.4.0 LTS(mysql-8.4.0-solaris11-sparc-64bit.tar)

    MySQL8.4.0 LTS(mysql-8.4.0-solaris11-sparc-64bit.tar)适用于Oracle Solaris 11 (SPARC)

    CVE-2018-3191 反弹shell

    反弹shell

    植物保护-深度学习-YOLOv5-病虫害识别训练数据集

    植物保护-深度学习-YOLOv5-病虫害识别训练数据集是一个精心策划的数据集,旨在为农业科技领域的研究人员提供强大的工具,以改善病虫害的识别和管理工作。数据集包含了10000张高清图像,覆盖了10余种常见的植物病虫害,每一张图像都经过了专业标注,确保了数据的质量和准确性。 为了进一步提升模型的泛化能力和鲁棒性,数据集经过了数据增强处理,包括随机旋转、翻转、缩放和裁剪等多种变换,从而扩大了训练数据的多样性。这种增强处理有助于模型学习到更多的特征,提高其在实际应用中的表现。 此数据集适用于深度学习框架YOLOv5,它是一个高效的目标检测模型,能够实时地识别和定位图像中的病虫害。通过使用这个数据集,研究人员可以训练和优化YOLOv5模型,使其在病虫害的早期检测和防治中发挥关键作用。 植物保护-深度学习-YOLOv5-病虫害识别训练数据集的推出,不仅能够促进农业科技的发展,还能够帮助农业生产者更有效地管理作物健康,减少农药使用,保护环境,实现可持续农业。

    MySQL8.4.0 LTS(mysql-server-8.4.0-1ubuntu22.04-amd64.deb-bundle)

    MySQL8.4.0 LTS(mysql-server_8.4.0-1ubuntu22.04_amd64.deb-bundle.tar)适用于Ubuntu 22.04 Linux (x86, 64-bit)

Global site tag (gtag.js) - Google Analytics