• Linq to sql(七):并发与事务(一)


    检测并发

           首先使用下面的SQL语句查询数据库的产品表:

    select * from products where categoryid=1

           查询结果如下图:


           为了看起来清晰,我已经事先把所有分类为1产品的价格和库存修改为相同值了。然后执行下面的程序:

            var query = from p in ctx.Products where p.CategoryID == 1 select p;

            foreach (var p in query)

                p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1);

            ctx.SubmitChanges(); // 在这里设断点

           我们使用调试方式启动,由于设置了断点,程序并没有进行更新操作。此时,我们在数据库中运行下面的语句:

    update products

    set unitsinstock = unitsinstock -2, unitprice= unitprice + 1

    where categoryid = 1

           然后在继续程序,会得到修改并发(乐观并发冲突)的异常,提示要修改的行不存在或者已经被改动。

    当客户端提交的修改对象自读取之后已经在数据库中发生改动,就产生了修改并发。解决并发的包括两步,

    一是查明哪些对象发生并发,二是解决并发。如果你仅仅是希望更新时不考虑并发的话可以关闭相关列的更新验证,

    这样在这些列上发生并发就不会出现异常:

    [Column(Storage="_UnitsInStock", DbType="SmallInt", UpdateCheck = UpdateCheck.Never)]

    [Column(Storage="_UnitPrice", DbType="Money", UpdateCheck = UpdateCheck.Never)]

           为这两列标注不需要进行更新检测。假设现在产品价格和库存分别是2732。那么,我们启动程序(设置端点)

    ,然后运行UPDATE语句,把价格+1,库存-2,然后价格和库存分别为2830了,继续程序可以发现价格

    和库存分别是2831。价格+1是之前更新的功劳,库存最终是-1是我们程序之后更新的功劳。

    当在同一个字段上(库存)发生并发冲突的时候,默认是最后的那次更新获胜。

  • 相关阅读:
    算法与设计模式
    Python开源应用系统
    ASP.NET MVC配置Redis服务
    常用3个框架
    Visual Studio 2015 编译错误 File 的值+乱码的解决方法
    SQL Server2008 R2命令行启动及停止SQL服务的方法
    Linux Shell查看物理CPU个数、核数、逻辑CPU个数
    SQL SERVER 2008R2 执行大脚本文件时,管理工具提示“内存不足”的解决方法
    MVC中未能加载程序集System.Web.Http/System.Web.Http.WebHost
    Windows10中启用原来的Windows照片查看器方法
  • 原文地址:https://www.cnblogs.com/kevin2013/p/1749055.html
Copyright © 2020-2023  润新知