• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    在Linq to Sql中使用記錄的時間戳進行檢測管理并發更新時的沖突

    發布: 2008-5-07 13:52 | 作者: 網絡轉載 | 來源: 本站原創 | 查看: 222次 | 進入軟件測試論壇討論

    領測軟件測試網
    try { LinqToSqlDemoDataContext dataContext = new LinqToSqlDemoDataContext(); Order order1 = dataContext.Orders.Single(o => o.OrderID == 1); Order order2 = dataContext.Orders.Single(o => o.OrderID == 2); Order order3 = dataContext.Orders.Single(o => o.OrderID == 3); Console.WriteLine('Order 1: ' + order1.Introduction); Console.WriteLine('Order 2: ' + order2.Introduction); Console.WriteLine('Order 3: ' + order3.Introduction); Console.WriteLine(); order1.Introduction = 'Order 1 modified.'; order2.Introduction = 'Order 2 modified.'; order3.Introduction = 'Order 3 modified.'; dataContext.Log = Console.Out; // 在下面的語句上設置一個斷點 dataContext.SubmitChanges(); } catch (ChangeConflictException e) { Console.WriteLine('---------- ' + e.Message + ' ----------'); } LinqToSqlDemoDataContext db = new LinqToSqlDemoDataContext(); Order o1 = db.Orders.Single(o => o.OrderID == 1); Order o2 = db.Orders.Single(o => o.OrderID == 2); Order o3 = db.Orders.Single(o => o.OrderID == 3); Console.WriteLine('Order 1: ' + o1.Introduction); Console.WriteLine('Order 2: ' + o2.Introduction); Console.WriteLine('Order 3: ' + o3.Introduction); Console.ReadLine();
      假設我們的數據表里有以下三條記錄:
    OrderID Name Introduction record_version 1 Order 1 This is order 1Binary data> 2 Order 2 This is order 2Binary data> 3 Order 3 This is order 3Binary data>
      當程序進入到SubmitChanges語句的斷點時,我們去數據庫中運行以下代碼,以修改OrderID為2的記錄。
    UPDATE Order SET OrderID = "New Order 2" WHERE OrderID = 2
      繼續運行程序,最終控制臺中會打印出以下信息:
    Order 1: This is order 1 Order 2: This is order 2 Order 3: This is order 3 UPDATE [dbo].[Order] SET [Introduction] = @p2 WHERE ([OrderID] = @p0) AND ([record_version] = @p1) SELECT [t1].[record_version] FROM [dbo].[Order] AS [t1] WHERE ((@@ROWCOUNT) > 0) AND ([t1].[OrderID] = @p3) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Timestamp (Size = 8; Prec = 0; Scale = 0) [SqlBinary(8)] -- @p2: Input NVarChar (Size = 26; Prec = 0; Scale = 0) [Order 1 modified.] -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8 UPDATE [dbo].[Order] SET [Introduction] = @p2 WHERE ([OrderID] = @p0) AND ([record_version] = @p1) SELECT [t1].[record_version] FROM [dbo].[Order] AS [t1] WHERE ((@@ROWCOUNT) > 0) AND ([t1].[OrderID] = @p3) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [2] -- @p1: Input Timestamp (Size = 8; Prec = 0; Scale = 0) [SqlBinary(8)] -- @p2: Input NVarChar (Size = 26; Prec = 0; Scale = 0) [Order 2 modified.] -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [2] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8 ---------- 1 of 2 updates failed. ---------- Order 1: This is order 1 Order 2: This is order 2 Order 3: This is order 3
      首先我們分別打印出三個Video對象的Introduction并將它們修改為新的值。在SubmitChanges方法調用之前,數據庫中ID為2的記錄已經被修改過了,因此在第一組UPDATE+SELECT調用成功之后——請注意,這是一次調用,Linq to Sql每次更新一條記錄——在更新第二條記錄之后發現了并發沖突。于是拋出異常(請注意異常的Message表示“兩次更新其中有一次失敗了”),第三條記錄也不會再更新了。在沖突發生之后,ID為2和紀錄自然沒有被修改(WHERE條件不成立),但是第一條記錄呢?從try...catch塊之后的操作中看,ID為1的記錄也沒有被更新。

      也就是說,第一次更新被回滾了。這自然是事務的作用。在調用(默認的) SubmitChanges方法時,Linq to Sql會把所有的更新放在同一個事務中,因此它們“共同進退”。但是由于業務需求不同,有時候我們不希望某條記錄的沖突導致了所有更新失敗。自然, Linq to Sql也提供了這個方面的控制。在下一篇文章中,我們就來看一下Linq to Sql中與樂觀并發控制有關的事務問題,以及出現并發沖突之后的解決方式。拼吾愛

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: LINQ Linq sql SQL Sql 管理 檢測 記錄


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>