zoukankan      html  css  js  c++  java
  • 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是我们程序之后更新的功劳。

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

  • 相关阅读:
    C++ 类的静态数据成员&静态成员函数
    C++构造函数
    世界末日的梦
    C++ const关键词
    平安夜的礼物
    C++ 友元
    D3D中的光照
    C++网络编程(卷1):学习笔记(一)
    Python 教程阅读笔记(四):数据结构
    Python 教程阅读笔记(三):更多控制流工具
  • 原文地址:https://www.cnblogs.com/kevin2013/p/1749055.html
Copyright © 2011-2022 走看看