乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      開放式并發(fā)沖突檢測(cè)的四種方法

       duduwolf 2005-08-06
              由于在BugTiger中需要用到?jīng)_突檢測(cè),所以對(duì)沖突檢測(cè)進(jìn)行了學(xué)習(xí),現(xiàn)總結(jié)了如下四種方法:

       .使用時(shí)間戳.

             在數(shù)據(jù)庫的表中添加一個(gè)時(shí)間戳列或版本列.時(shí)間戳列與對(duì)表內(nèi)容的查詢一起返回.當(dāng)試圖更新時(shí),數(shù)據(jù)庫中的時(shí)間戳值將與被修改行中的原始時(shí)間戳值進(jìn)行比較.如果這兩個(gè)值匹配,則執(zhí)行更新,同時(shí)時(shí)間戳列被更新為當(dāng)前時(shí)間以反映更新.如果這兩個(gè)值不匹配,則發(fā)生開放式并發(fā)沖突.

       示例

      表結(jié)構(gòu)(Method1):


      BugTimeStamp
      為時(shí)間戳列.

      當(dāng)用戶取得數(shù)據(jù)時(shí),BugTimeStamp列也返回給用戶.

      SELECT BugID, BugType, BugTimeStamp

      FROM Method1

      當(dāng)用戶更新時(shí)BugTimeStamp作為條件進(jìn)行比較.

      UPDATE Method1
      SET BugType = b
      WHERE (BugID = 1AND (BugTimeStamp = 0x00000000000004B1)

      更新時(shí)如果從上次讀取數(shù)據(jù)到這次更新這段時(shí)間內(nèi)已經(jīng)被更改過了,條件顯然是不成立了.因?yàn)槊看胃掠涗洉r(shí),timestamp 列中的值均會(huì)更新.

       .保留原始數(shù)據(jù)值的副本.

      在查詢數(shù)據(jù)庫的數(shù)據(jù)時(shí)保留原始數(shù)據(jù)值的一個(gè)副本.在更新數(shù)據(jù)庫時(shí),檢查數(shù)據(jù)庫的當(dāng)前值是否與原始值匹配.原始值保存在 DataSet ,當(dāng)更新數(shù)據(jù)庫時(shí),數(shù)據(jù)適配器可以使用該原始值執(zhí)行開放式并發(fā)檢查.

       示例.

      表結(jié)構(gòu)(Method2)


       

      UPDATE Tasks 

      SET BugType = @ BugType 

      WHERE (BugID = @BugDAND (BugType = @Original_BugType

       
      @Original_BugType 可以這樣指定

      SqlUpdateCommand1.Parameters.Add(new SqlParameter("@Original_BugType", SqlDbType.Char, 10, ParameterDirection.Input, false00" BugType ", DataRowVersion.Original, null));


      .多列確定原則(我自己命名的,)

             可以通過一表中的最后更新時(shí)間(LastUpdateDate)和最后更新用戶(LastUpdateUserID)來確定一條記錄是否已經(jīng)被其他用戶修改.如果只用最后更新時(shí)間,還是會(huì)有沖突發(fā)現(xiàn),雖然這樣的概率比較低,因?yàn)?/SPAN>DateTime的精確度為百分之三秒,A用戶取出后的足夠短的時(shí)間內(nèi)有B用戶修改了數(shù)據(jù),這時(shí)最后更新時(shí)間沒有發(fā)生變化,但是數(shù)據(jù)有變化了,所以當(dāng)A用戶修改時(shí)實(shí)際上已經(jīng)發(fā)生了沖突.使用最后更新用戶(LastUpdateUserID),還是上述情況,由于LastUpdateUserID已經(jīng)更改,只要A用戶更新時(shí)同時(shí)檢查最后更新時(shí)間(LastUpdateDate)和最后更新用戶(LastUpdateUserID)就可以檢查出沖突.

             在這種方法里假設(shè)了同一用戶在百分之三秒不可能進(jìn)行兩次更新.我覺得這樣的假設(shè)在通常情況下是合理的.

             示例:

             表結(jié)構(gòu)(Method3)

             取數(shù)據(jù)

         

          SELECT [BugID][BugProject][BugType][LastUpdateDate][LastUserID] FROM [Method3]

             更新數(shù)據(jù)時(shí)

      UPDATE [Method3]

      SET BugID = @BugID[BugProject] = @BugProject[BugType] = @BugType[LastUpdateDate] = @LastUpdateDate , [LastUserID]= @LastUserID,

      WHERE [BugID]= @BugID , [LastUpdateDate]=@ OriginalLastUpdateDate , [LastUserID] = @OriginalLastUserID



      .
      BINARY_CHECKSUM

      SQL聯(lián)機(jī)叢書上的解釋:

      在表中任一行上計(jì)算的 BINARY_CHECKSUM(*) 返回相同的值,只要隨后沒有修改行.BINARY_CHECKSUM(*) 將為大多數(shù)(但不是全部)行更改返回不同的值,并可用于檢測(cè)大多數(shù)行修改.

       這各方法有很大的局限性:

      BINARY_CHECKSUM 在計(jì)算中忽略具有不可比數(shù)據(jù)類型的列.不可比數(shù)據(jù)類型是 text、ntextimage、cursor 以及基本類型為前 4 個(gè)數(shù)據(jù)類型之一的 sql_variant.

      字符串的區(qū)域設(shè)置可能導(dǎo)致具有不同表示法的字符串進(jìn)行等值比較.在區(qū)分大小寫的服務(wù)器中,字符串"McCavity""Mccavity" BINARY_CHECKSUM 值不同.反之,在不區(qū)分大小寫的服務(wù)器中,上述字符串的 CHECKSUM 返回相同的校驗(yàn)值.

      示例.

      表結(jié)構(gòu)(Method4)



      取數(shù)據(jù)時(shí)把
      BINARY_CHECKSUM(*)也返回給用戶

      SELECT [BugType], BINARY_CHECKSUM(*AS RowCheckSum
      FROM [Method4]


      當(dāng)用戶修改數(shù)據(jù)時(shí)

      UPDATE Method4
      SET BugType = b
      WHERE (BugID = 1AND (CHECKSUM(*= @ RowCheckSum) 

       四種方式的比較

      1.       優(yōu)點(diǎn):實(shí)現(xiàn)比較簡(jiǎn)單,timestamp 列中的值會(huì)更新.不足:要增加一個(gè)額外的字段.

      2.       優(yōu)點(diǎn):可靠,不需要額外字段.不足:當(dāng)字段較多時(shí)需要較多的參數(shù).

      3.       優(yōu)點(diǎn):2相比,傳遞的參數(shù)較少.不足:使用的字段對(duì)系統(tǒng)不一定有存在的意義,如例子中的最后更新時(shí)間(LastUpdateDate)和最后更新用戶(LastUpdateUserID)有時(shí)對(duì)系統(tǒng)不是必需的.

      4.       優(yōu)點(diǎn):不需要額外字段,只需要一個(gè)參數(shù).不足:有些數(shù)據(jù)類型不可比BINARY_CHECKSUM, 字符串的區(qū)域設(shè)置可能導(dǎo)致具有不同表示法的字符串進(jìn)行等值比較. 只為大多數(shù)(但不是全部)行更改返回不同的值. (筆者注:不知道這個(gè)大多數(shù)是什么概率.)

       

      參考文檔

      n         《數(shù)據(jù)層組件設(shè)計(jì)與數(shù)據(jù)傳遞》http://www.yesky.com/20021112/1639500.shtml

      n         hudan 的留言http://zitiger.cnblogs.com/archive/2005/08/05/208580.aspx#208605

      n         TaskVision  http://www./Applications/application.aspx?PageID=20&tabindex=8

      n         IssueVision  http://www./Applications/application.aspx?PageID=40&tabindex=8

      n         SQL Server 聯(lián)機(jī)叢書》

      n         MSDN

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多