• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      數(shù)據(jù)庫(kù)并發(fā)操作中丟失更新現(xiàn)象的研究

      2014-10-10 16:59周薇
      電腦知識(shí)與技術(shù) 2014年24期
      關(guān)鍵詞:數(shù)據(jù)庫(kù)

      周薇

      摘要: 丟失更新(lost update)是一個(gè)經(jīng)典的數(shù)據(jù)庫(kù)問(wèn)題,在多用戶(hù)計(jì)算機(jī)環(huán)境中存在。作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)者,通過(guò)感同身受的例子,向大家展示何為丟失更新現(xiàn)象,并對(duì)這種現(xiàn)象進(jìn)行一定的研究。同時(shí),提出幾種防止的策略。

      關(guān)鍵詞:數(shù)據(jù)庫(kù);丟失更新;防止策略

      中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)24-5593-02

      Lost Update Phenomena of Research in the Database Concurrency Operations

      ZHOU Wei

      (Wuxi Institute of Technology, Wuxi 214121, China)

      Abstract: Lost update is a classic database problem. It exists in a multi-user computer environment. As a database developer, through empathy example, to show what is lost update phenomenon, and conduct some research this phenomenon. Meanwhile, put forward several prevention strategies.

      Key words: database; lost update; prevention strategies

      1 概述

      當(dāng)2個(gè)或多個(gè)用戶(hù)同時(shí)(時(shí)間上重疊)編輯同一行數(shù)據(jù)時(shí)會(huì)發(fā)生丟失更新,特別是在基于Web的應(yīng)用程序中常常出現(xiàn)。在實(shí)際運(yùn)行過(guò)程中,可能在幾天甚至幾個(gè)月中才會(huì)出現(xiàn)一次。這種現(xiàn)象只是隨機(jī)地、零星地出現(xiàn),而且在受控環(huán)境中完全不可再生,對(duì)應(yīng)用程序是致命的。導(dǎo)致開(kāi)發(fā)人員誤以為是用戶(hù)的錯(cuò)誤,其實(shí)是開(kāi)發(fā)人員在編寫(xiě)應(yīng)用程序的時(shí)候,沒(méi)有處理好DML命令。

      2 丟失更新的現(xiàn)象

      丟失更新是指2個(gè)或多個(gè)事務(wù)讀取同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)事務(wù)的修改結(jié)果破壞了另一個(gè)事務(wù)修改的結(jié)果。有兩類(lèi)丟失更新:

      1) A事務(wù)撤銷(xiāo)時(shí),把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了。這種錯(cuò)誤可能造成很?chē)?yán)重的問(wèn)題。A事務(wù)在撤銷(xiāo)時(shí),“不小心”將B事務(wù)已經(jīng)轉(zhuǎn)入賬戶(hù)的金額給抹去了。

      2) A事務(wù)覆蓋B事務(wù)已經(jīng)提交的數(shù)據(jù),造成B事務(wù)所做操作丟失。由于轉(zhuǎn)賬事務(wù)覆蓋了取款事務(wù)對(duì)存款余額所做的更新,導(dǎo)致銀行最后損失了100元,相反如果轉(zhuǎn)賬事務(wù)先提交,那么用戶(hù)賬戶(hù)將損失100元。

      在此過(guò)程中,買(mǎi)家A的“取消”訂單的動(dòng)作,發(fā)生丟失。同時(shí),對(duì)賣(mài)家造成了一定的經(jīng)濟(jì)損失。

      如何防止買(mǎi)家A的“取消”動(dòng)作不會(huì)丟失,或者賣(mài)家的“發(fā)貨”動(dòng)作不會(huì)丟失呢?下面提出4種策略,加以證明。

      4 防止丟失更新的策略

      1) 設(shè)置數(shù)據(jù)庫(kù)的隔離級(jí)別為Serializable

      當(dāng)是查詢(xún)操作的時(shí)候添加共享鎖,共享鎖下被人可以訪問(wèn)同一條記錄;當(dāng)進(jìn)行修改操作的時(shí)候加排他鎖,別人不可以修改。內(nèi)在機(jī)制是異常退出機(jī)制。

      賣(mài)家查詢(xún)訂單的時(shí)候,給這個(gè)訂單記錄添加了共享鎖,買(mǎi)家可以查看。同理,買(mǎi)家查看他的訂單的時(shí)候,也為自己的記錄添加了共享鎖,但共享鎖下不能再添加排他鎖。當(dāng)賣(mài)家想做修改操作(“發(fā)貨”)的時(shí)候,給這個(gè)訂單記錄添加一個(gè)排他鎖是加不上的,他需要等,等待買(mǎi)家釋放了共享鎖,也就是提交了事務(wù),這個(gè)排它鎖才可以加上。但此時(shí),如果買(mǎi)家也想操作這個(gè)訂單記錄,想給他的訂單記錄添加排他鎖,也是不可以的,因?yàn)橘u(mài)家那邊已經(jīng)有了共享鎖,買(mǎi)家想操作的話(huà),也必須讓賣(mài)家去釋放這個(gè)共享鎖。這樣,賣(mài)家就要等買(mǎi)家,買(mǎi)家也要等賣(mài)家。假設(shè),此時(shí)買(mǎi)家做了修改的操作,根據(jù)共享鎖存在的情況下,不能加排他鎖的原則,買(mǎi)家那里就會(huì)出現(xiàn)異常。此時(shí)這個(gè)“取消”操作終止,“取消”操作無(wú)效。就不會(huì)產(chǎn)生“取消”操作的丟失。

      2) 悲觀鎖

      一種進(jìn)行修改的時(shí)候,就給這條訂單記錄加鎖,別人就不能再操作了。悲觀鎖就是程序員認(rèn)為,客戶(hù)訪問(wèn)某條記錄的時(shí)候,很有可能其他人也在訪問(wèn)同條記錄。保險(xiǎn)起見(jiàn),為這條訂單記錄加一把悲觀鎖,此時(shí)其他任何人都不可以修改這條記錄。這種鎖,適用于更新多查詢(xún)少的系統(tǒng)。

      3) 樂(lè)觀鎖

      樂(lè)觀鎖就是指當(dāng)買(mǎi)家或賣(mài)家要修改一條訂單記錄的時(shí)候,不認(rèn)為會(huì)有別人和自己同時(shí)操作這條訂單記錄。可利用至少兩種方式實(shí)現(xiàn):

      (1) 在訂單表中,添加一個(gè)version字段,數(shù)據(jù)類(lèi)型為identity,表示版本

      在修改的的時(shí)候利用版本號(hào)機(jī)制,那么別人的操作會(huì)因?yàn)榘姹咎?hào)的差異而失效。當(dāng)?shù)谝淮尾僮鞯耐戤叺臅r(shí)候,這個(gè)版本號(hào)就自動(dòng)加1,此時(shí)別人如果想要修改這條記錄的時(shí)候,會(huì)因?yàn)榘姹咎?hào)的原因就不能做修改了。適用于查詢(xún)多更新少的系統(tǒng)。

      (2) 在訂單表中,添加一個(gè)timestamp字段,數(shù)據(jù)類(lèi)型也為timestamp時(shí)間戳(類(lèi)似于郵局的郵戳)

      時(shí)間戳列中存放的是一個(gè)十六進(jìn)制的數(shù)據(jù),不管是買(mǎi)家或賣(mài)家的任何操作,都會(huì)產(chǎn)生一個(gè)唯一的時(shí)間戳值。在賣(mài)家“發(fā)貨”或買(mǎi)家“取消”訂單的時(shí)候,都會(huì)檢測(cè)時(shí)間戳值的值有沒(méi)有發(fā)生變化。如果不變,則繼續(xù);反之,則操作不能進(jìn)行。

      4) 通過(guò)IF語(yǔ)句搭配訂單狀態(tài)的檢查,也可防止丟失更新

      (1) 假如買(mǎi)家想“取消”訂單,操作代碼如圖3。

      (2) 假如賣(mài)家想為訂單“發(fā)貨”,操作代碼如圖4。

      圖4 發(fā)貨

      這樣,不管“取消”、“發(fā)貨”兩個(gè)動(dòng)作發(fā)生的先后次序如何,均不會(huì)發(fā)生“取消”丟失,或“發(fā)貨”丟失。

      5 結(jié)束語(yǔ)

      在數(shù)據(jù)庫(kù)并發(fā)操作過(guò)程中,如果丟失更新的現(xiàn)象,數(shù)據(jù)庫(kù)開(kāi)發(fā)人員在設(shè)計(jì)的時(shí)候,就能考慮全面,那么是完全能夠避免的。除

      了程序控制外,還有許多工具也可以保護(hù)、避免這種情況,如Oracle Forms和HTML DB等。這些工具能確保:從查詢(xún)記錄的那個(gè)時(shí)刻開(kāi)始,這個(gè)記錄沒(méi)有改變,而且對(duì)它執(zhí)行任何修改時(shí)都會(huì)將其鎖定。為了用戶(hù)的切身利益,作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)者,將繼續(xù)研究丟失更新的現(xiàn)象,尋求更多的解決辦法。

      參考文獻(xiàn):

      [1](美)劉易斯.數(shù)據(jù)庫(kù)與事務(wù)處理[M]. 1版.北京:機(jī)械工業(yè)出版社,2005:537-547.

      [2] 程云志.數(shù)據(jù)庫(kù)原理與SQL Server 2005應(yīng)用教程[M]. 1版.北京:機(jī)械工業(yè)出版社,2012:236-240.

      [3] 蔣瀚洋,李月軍,龐婭娟.SQL Server 2005數(shù)據(jù)庫(kù)管理與開(kāi)發(fā)教程[M]. 1版.北京:人民郵電出版社,2009:147-152.

      [4] 陸琳,劉桂林.數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用-SQL server 2005(應(yīng)用篇)[M]. 1版.長(zhǎng)沙:中南大學(xué)出版社,2010:290-295.

      [5] 呂鵬.數(shù)據(jù)庫(kù)更新丟失解決方案.IT/計(jì)算.[2011-08-10].

      [6] 孟憲虎,馬雪英,鄧緒斌.大型數(shù)據(jù)庫(kù)管理系統(tǒng)技術(shù)、應(yīng)用與實(shí)例分析——基于SQL Server 2005[M]. 2版.北京:電子工業(yè)出版社,2011:119-137

      [7] 李萍,黃可望,黃能耿.SQL Server 數(shù)據(jù)庫(kù)應(yīng)用及實(shí)訓(xùn)[M].1版.無(wú)錫職業(yè)技術(shù)學(xué)院,2014:96-102.endprint

      摘要: 丟失更新(lost update)是一個(gè)經(jīng)典的數(shù)據(jù)庫(kù)問(wèn)題,在多用戶(hù)計(jì)算機(jī)環(huán)境中存在。作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)者,通過(guò)感同身受的例子,向大家展示何為丟失更新現(xiàn)象,并對(duì)這種現(xiàn)象進(jìn)行一定的研究。同時(shí),提出幾種防止的策略。

      關(guān)鍵詞:數(shù)據(jù)庫(kù);丟失更新;防止策略

      中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)24-5593-02

      Lost Update Phenomena of Research in the Database Concurrency Operations

      ZHOU Wei

      (Wuxi Institute of Technology, Wuxi 214121, China)

      Abstract: Lost update is a classic database problem. It exists in a multi-user computer environment. As a database developer, through empathy example, to show what is lost update phenomenon, and conduct some research this phenomenon. Meanwhile, put forward several prevention strategies.

      Key words: database; lost update; prevention strategies

      1 概述

      當(dāng)2個(gè)或多個(gè)用戶(hù)同時(shí)(時(shí)間上重疊)編輯同一行數(shù)據(jù)時(shí)會(huì)發(fā)生丟失更新,特別是在基于Web的應(yīng)用程序中常常出現(xiàn)。在實(shí)際運(yùn)行過(guò)程中,可能在幾天甚至幾個(gè)月中才會(huì)出現(xiàn)一次。這種現(xiàn)象只是隨機(jī)地、零星地出現(xiàn),而且在受控環(huán)境中完全不可再生,對(duì)應(yīng)用程序是致命的。導(dǎo)致開(kāi)發(fā)人員誤以為是用戶(hù)的錯(cuò)誤,其實(shí)是開(kāi)發(fā)人員在編寫(xiě)應(yīng)用程序的時(shí)候,沒(méi)有處理好DML命令。

      2 丟失更新的現(xiàn)象

      丟失更新是指2個(gè)或多個(gè)事務(wù)讀取同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)事務(wù)的修改結(jié)果破壞了另一個(gè)事務(wù)修改的結(jié)果。有兩類(lèi)丟失更新:

      1) A事務(wù)撤銷(xiāo)時(shí),把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了。這種錯(cuò)誤可能造成很?chē)?yán)重的問(wèn)題。A事務(wù)在撤銷(xiāo)時(shí),“不小心”將B事務(wù)已經(jīng)轉(zhuǎn)入賬戶(hù)的金額給抹去了。

      2) A事務(wù)覆蓋B事務(wù)已經(jīng)提交的數(shù)據(jù),造成B事務(wù)所做操作丟失。由于轉(zhuǎn)賬事務(wù)覆蓋了取款事務(wù)對(duì)存款余額所做的更新,導(dǎo)致銀行最后損失了100元,相反如果轉(zhuǎn)賬事務(wù)先提交,那么用戶(hù)賬戶(hù)將損失100元。

      在此過(guò)程中,買(mǎi)家A的“取消”訂單的動(dòng)作,發(fā)生丟失。同時(shí),對(duì)賣(mài)家造成了一定的經(jīng)濟(jì)損失。

      如何防止買(mǎi)家A的“取消”動(dòng)作不會(huì)丟失,或者賣(mài)家的“發(fā)貨”動(dòng)作不會(huì)丟失呢?下面提出4種策略,加以證明。

      4 防止丟失更新的策略

      1) 設(shè)置數(shù)據(jù)庫(kù)的隔離級(jí)別為Serializable

      當(dāng)是查詢(xún)操作的時(shí)候添加共享鎖,共享鎖下被人可以訪問(wèn)同一條記錄;當(dāng)進(jìn)行修改操作的時(shí)候加排他鎖,別人不可以修改。內(nèi)在機(jī)制是異常退出機(jī)制。

      賣(mài)家查詢(xún)訂單的時(shí)候,給這個(gè)訂單記錄添加了共享鎖,買(mǎi)家可以查看。同理,買(mǎi)家查看他的訂單的時(shí)候,也為自己的記錄添加了共享鎖,但共享鎖下不能再添加排他鎖。當(dāng)賣(mài)家想做修改操作(“發(fā)貨”)的時(shí)候,給這個(gè)訂單記錄添加一個(gè)排他鎖是加不上的,他需要等,等待買(mǎi)家釋放了共享鎖,也就是提交了事務(wù),這個(gè)排它鎖才可以加上。但此時(shí),如果買(mǎi)家也想操作這個(gè)訂單記錄,想給他的訂單記錄添加排他鎖,也是不可以的,因?yàn)橘u(mài)家那邊已經(jīng)有了共享鎖,買(mǎi)家想操作的話(huà),也必須讓賣(mài)家去釋放這個(gè)共享鎖。這樣,賣(mài)家就要等買(mǎi)家,買(mǎi)家也要等賣(mài)家。假設(shè),此時(shí)買(mǎi)家做了修改的操作,根據(jù)共享鎖存在的情況下,不能加排他鎖的原則,買(mǎi)家那里就會(huì)出現(xiàn)異常。此時(shí)這個(gè)“取消”操作終止,“取消”操作無(wú)效。就不會(huì)產(chǎn)生“取消”操作的丟失。

      2) 悲觀鎖

      一種進(jìn)行修改的時(shí)候,就給這條訂單記錄加鎖,別人就不能再操作了。悲觀鎖就是程序員認(rèn)為,客戶(hù)訪問(wèn)某條記錄的時(shí)候,很有可能其他人也在訪問(wèn)同條記錄。保險(xiǎn)起見(jiàn),為這條訂單記錄加一把悲觀鎖,此時(shí)其他任何人都不可以修改這條記錄。這種鎖,適用于更新多查詢(xún)少的系統(tǒng)。

      3) 樂(lè)觀鎖

      樂(lè)觀鎖就是指當(dāng)買(mǎi)家或賣(mài)家要修改一條訂單記錄的時(shí)候,不認(rèn)為會(huì)有別人和自己同時(shí)操作這條訂單記錄??衫弥辽賰煞N方式實(shí)現(xiàn):

      (1) 在訂單表中,添加一個(gè)version字段,數(shù)據(jù)類(lèi)型為identity,表示版本

      在修改的的時(shí)候利用版本號(hào)機(jī)制,那么別人的操作會(huì)因?yàn)榘姹咎?hào)的差異而失效。當(dāng)?shù)谝淮尾僮鞯耐戤叺臅r(shí)候,這個(gè)版本號(hào)就自動(dòng)加1,此時(shí)別人如果想要修改這條記錄的時(shí)候,會(huì)因?yàn)榘姹咎?hào)的原因就不能做修改了。適用于查詢(xún)多更新少的系統(tǒng)。

      (2) 在訂單表中,添加一個(gè)timestamp字段,數(shù)據(jù)類(lèi)型也為timestamp時(shí)間戳(類(lèi)似于郵局的郵戳)

      時(shí)間戳列中存放的是一個(gè)十六進(jìn)制的數(shù)據(jù),不管是買(mǎi)家或賣(mài)家的任何操作,都會(huì)產(chǎn)生一個(gè)唯一的時(shí)間戳值。在賣(mài)家“發(fā)貨”或買(mǎi)家“取消”訂單的時(shí)候,都會(huì)檢測(cè)時(shí)間戳值的值有沒(méi)有發(fā)生變化。如果不變,則繼續(xù);反之,則操作不能進(jìn)行。

      4) 通過(guò)IF語(yǔ)句搭配訂單狀態(tài)的檢查,也可防止丟失更新

      (1) 假如買(mǎi)家想“取消”訂單,操作代碼如圖3。

      (2) 假如賣(mài)家想為訂單“發(fā)貨”,操作代碼如圖4。

      圖4 發(fā)貨

      這樣,不管“取消”、“發(fā)貨”兩個(gè)動(dòng)作發(fā)生的先后次序如何,均不會(huì)發(fā)生“取消”丟失,或“發(fā)貨”丟失。

      5 結(jié)束語(yǔ)

      在數(shù)據(jù)庫(kù)并發(fā)操作過(guò)程中,如果丟失更新的現(xiàn)象,數(shù)據(jù)庫(kù)開(kāi)發(fā)人員在設(shè)計(jì)的時(shí)候,就能考慮全面,那么是完全能夠避免的。除

      了程序控制外,還有許多工具也可以保護(hù)、避免這種情況,如Oracle Forms和HTML DB等。這些工具能確保:從查詢(xún)記錄的那個(gè)時(shí)刻開(kāi)始,這個(gè)記錄沒(méi)有改變,而且對(duì)它執(zhí)行任何修改時(shí)都會(huì)將其鎖定。為了用戶(hù)的切身利益,作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)者,將繼續(xù)研究丟失更新的現(xiàn)象,尋求更多的解決辦法。

      參考文獻(xiàn):

      [1](美)劉易斯.數(shù)據(jù)庫(kù)與事務(wù)處理[M]. 1版.北京:機(jī)械工業(yè)出版社,2005:537-547.

      [2] 程云志.數(shù)據(jù)庫(kù)原理與SQL Server 2005應(yīng)用教程[M]. 1版.北京:機(jī)械工業(yè)出版社,2012:236-240.

      [3] 蔣瀚洋,李月軍,龐婭娟.SQL Server 2005數(shù)據(jù)庫(kù)管理與開(kāi)發(fā)教程[M]. 1版.北京:人民郵電出版社,2009:147-152.

      [4] 陸琳,劉桂林.數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用-SQL server 2005(應(yīng)用篇)[M]. 1版.長(zhǎng)沙:中南大學(xué)出版社,2010:290-295.

      [5] 呂鵬.數(shù)據(jù)庫(kù)更新丟失解決方案.IT/計(jì)算.[2011-08-10].

      [6] 孟憲虎,馬雪英,鄧緒斌.大型數(shù)據(jù)庫(kù)管理系統(tǒng)技術(shù)、應(yīng)用與實(shí)例分析——基于SQL Server 2005[M]. 2版.北京:電子工業(yè)出版社,2011:119-137

      [7] 李萍,黃可望,黃能耿.SQL Server 數(shù)據(jù)庫(kù)應(yīng)用及實(shí)訓(xùn)[M].1版.無(wú)錫職業(yè)技術(shù)學(xué)院,2014:96-102.endprint

      摘要: 丟失更新(lost update)是一個(gè)經(jīng)典的數(shù)據(jù)庫(kù)問(wèn)題,在多用戶(hù)計(jì)算機(jī)環(huán)境中存在。作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)者,通過(guò)感同身受的例子,向大家展示何為丟失更新現(xiàn)象,并對(duì)這種現(xiàn)象進(jìn)行一定的研究。同時(shí),提出幾種防止的策略。

      關(guān)鍵詞:數(shù)據(jù)庫(kù);丟失更新;防止策略

      中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)24-5593-02

      Lost Update Phenomena of Research in the Database Concurrency Operations

      ZHOU Wei

      (Wuxi Institute of Technology, Wuxi 214121, China)

      Abstract: Lost update is a classic database problem. It exists in a multi-user computer environment. As a database developer, through empathy example, to show what is lost update phenomenon, and conduct some research this phenomenon. Meanwhile, put forward several prevention strategies.

      Key words: database; lost update; prevention strategies

      1 概述

      當(dāng)2個(gè)或多個(gè)用戶(hù)同時(shí)(時(shí)間上重疊)編輯同一行數(shù)據(jù)時(shí)會(huì)發(fā)生丟失更新,特別是在基于Web的應(yīng)用程序中常常出現(xiàn)。在實(shí)際運(yùn)行過(guò)程中,可能在幾天甚至幾個(gè)月中才會(huì)出現(xiàn)一次。這種現(xiàn)象只是隨機(jī)地、零星地出現(xiàn),而且在受控環(huán)境中完全不可再生,對(duì)應(yīng)用程序是致命的。導(dǎo)致開(kāi)發(fā)人員誤以為是用戶(hù)的錯(cuò)誤,其實(shí)是開(kāi)發(fā)人員在編寫(xiě)應(yīng)用程序的時(shí)候,沒(méi)有處理好DML命令。

      2 丟失更新的現(xiàn)象

      丟失更新是指2個(gè)或多個(gè)事務(wù)讀取同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)事務(wù)的修改結(jié)果破壞了另一個(gè)事務(wù)修改的結(jié)果。有兩類(lèi)丟失更新:

      1) A事務(wù)撤銷(xiāo)時(shí),把已經(jīng)提交的B事務(wù)的更新數(shù)據(jù)覆蓋了。這種錯(cuò)誤可能造成很?chē)?yán)重的問(wèn)題。A事務(wù)在撤銷(xiāo)時(shí),“不小心”將B事務(wù)已經(jīng)轉(zhuǎn)入賬戶(hù)的金額給抹去了。

      2) A事務(wù)覆蓋B事務(wù)已經(jīng)提交的數(shù)據(jù),造成B事務(wù)所做操作丟失。由于轉(zhuǎn)賬事務(wù)覆蓋了取款事務(wù)對(duì)存款余額所做的更新,導(dǎo)致銀行最后損失了100元,相反如果轉(zhuǎn)賬事務(wù)先提交,那么用戶(hù)賬戶(hù)將損失100元。

      在此過(guò)程中,買(mǎi)家A的“取消”訂單的動(dòng)作,發(fā)生丟失。同時(shí),對(duì)賣(mài)家造成了一定的經(jīng)濟(jì)損失。

      如何防止買(mǎi)家A的“取消”動(dòng)作不會(huì)丟失,或者賣(mài)家的“發(fā)貨”動(dòng)作不會(huì)丟失呢?下面提出4種策略,加以證明。

      4 防止丟失更新的策略

      1) 設(shè)置數(shù)據(jù)庫(kù)的隔離級(jí)別為Serializable

      當(dāng)是查詢(xún)操作的時(shí)候添加共享鎖,共享鎖下被人可以訪問(wèn)同一條記錄;當(dāng)進(jìn)行修改操作的時(shí)候加排他鎖,別人不可以修改。內(nèi)在機(jī)制是異常退出機(jī)制。

      賣(mài)家查詢(xún)訂單的時(shí)候,給這個(gè)訂單記錄添加了共享鎖,買(mǎi)家可以查看。同理,買(mǎi)家查看他的訂單的時(shí)候,也為自己的記錄添加了共享鎖,但共享鎖下不能再添加排他鎖。當(dāng)賣(mài)家想做修改操作(“發(fā)貨”)的時(shí)候,給這個(gè)訂單記錄添加一個(gè)排他鎖是加不上的,他需要等,等待買(mǎi)家釋放了共享鎖,也就是提交了事務(wù),這個(gè)排它鎖才可以加上。但此時(shí),如果買(mǎi)家也想操作這個(gè)訂單記錄,想給他的訂單記錄添加排他鎖,也是不可以的,因?yàn)橘u(mài)家那邊已經(jīng)有了共享鎖,買(mǎi)家想操作的話(huà),也必須讓賣(mài)家去釋放這個(gè)共享鎖。這樣,賣(mài)家就要等買(mǎi)家,買(mǎi)家也要等賣(mài)家。假設(shè),此時(shí)買(mǎi)家做了修改的操作,根據(jù)共享鎖存在的情況下,不能加排他鎖的原則,買(mǎi)家那里就會(huì)出現(xiàn)異常。此時(shí)這個(gè)“取消”操作終止,“取消”操作無(wú)效。就不會(huì)產(chǎn)生“取消”操作的丟失。

      2) 悲觀鎖

      一種進(jìn)行修改的時(shí)候,就給這條訂單記錄加鎖,別人就不能再操作了。悲觀鎖就是程序員認(rèn)為,客戶(hù)訪問(wèn)某條記錄的時(shí)候,很有可能其他人也在訪問(wèn)同條記錄。保險(xiǎn)起見(jiàn),為這條訂單記錄加一把悲觀鎖,此時(shí)其他任何人都不可以修改這條記錄。這種鎖,適用于更新多查詢(xún)少的系統(tǒng)。

      3) 樂(lè)觀鎖

      樂(lè)觀鎖就是指當(dāng)買(mǎi)家或賣(mài)家要修改一條訂單記錄的時(shí)候,不認(rèn)為會(huì)有別人和自己同時(shí)操作這條訂單記錄。可利用至少兩種方式實(shí)現(xiàn):

      (1) 在訂單表中,添加一個(gè)version字段,數(shù)據(jù)類(lèi)型為identity,表示版本

      在修改的的時(shí)候利用版本號(hào)機(jī)制,那么別人的操作會(huì)因?yàn)榘姹咎?hào)的差異而失效。當(dāng)?shù)谝淮尾僮鞯耐戤叺臅r(shí)候,這個(gè)版本號(hào)就自動(dòng)加1,此時(shí)別人如果想要修改這條記錄的時(shí)候,會(huì)因?yàn)榘姹咎?hào)的原因就不能做修改了。適用于查詢(xún)多更新少的系統(tǒng)。

      (2) 在訂單表中,添加一個(gè)timestamp字段,數(shù)據(jù)類(lèi)型也為timestamp時(shí)間戳(類(lèi)似于郵局的郵戳)

      時(shí)間戳列中存放的是一個(gè)十六進(jìn)制的數(shù)據(jù),不管是買(mǎi)家或賣(mài)家的任何操作,都會(huì)產(chǎn)生一個(gè)唯一的時(shí)間戳值。在賣(mài)家“發(fā)貨”或買(mǎi)家“取消”訂單的時(shí)候,都會(huì)檢測(cè)時(shí)間戳值的值有沒(méi)有發(fā)生變化。如果不變,則繼續(xù);反之,則操作不能進(jìn)行。

      4) 通過(guò)IF語(yǔ)句搭配訂單狀態(tài)的檢查,也可防止丟失更新

      (1) 假如買(mǎi)家想“取消”訂單,操作代碼如圖3。

      (2) 假如賣(mài)家想為訂單“發(fā)貨”,操作代碼如圖4。

      圖4 發(fā)貨

      這樣,不管“取消”、“發(fā)貨”兩個(gè)動(dòng)作發(fā)生的先后次序如何,均不會(huì)發(fā)生“取消”丟失,或“發(fā)貨”丟失。

      5 結(jié)束語(yǔ)

      在數(shù)據(jù)庫(kù)并發(fā)操作過(guò)程中,如果丟失更新的現(xiàn)象,數(shù)據(jù)庫(kù)開(kāi)發(fā)人員在設(shè)計(jì)的時(shí)候,就能考慮全面,那么是完全能夠避免的。除

      了程序控制外,還有許多工具也可以保護(hù)、避免這種情況,如Oracle Forms和HTML DB等。這些工具能確保:從查詢(xún)記錄的那個(gè)時(shí)刻開(kāi)始,這個(gè)記錄沒(méi)有改變,而且對(duì)它執(zhí)行任何修改時(shí)都會(huì)將其鎖定。為了用戶(hù)的切身利益,作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)者,將繼續(xù)研究丟失更新的現(xiàn)象,尋求更多的解決辦法。

      參考文獻(xiàn):

      [1](美)劉易斯.數(shù)據(jù)庫(kù)與事務(wù)處理[M]. 1版.北京:機(jī)械工業(yè)出版社,2005:537-547.

      [2] 程云志.數(shù)據(jù)庫(kù)原理與SQL Server 2005應(yīng)用教程[M]. 1版.北京:機(jī)械工業(yè)出版社,2012:236-240.

      [3] 蔣瀚洋,李月軍,龐婭娟.SQL Server 2005數(shù)據(jù)庫(kù)管理與開(kāi)發(fā)教程[M]. 1版.北京:人民郵電出版社,2009:147-152.

      [4] 陸琳,劉桂林.數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用-SQL server 2005(應(yīng)用篇)[M]. 1版.長(zhǎng)沙:中南大學(xué)出版社,2010:290-295.

      [5] 呂鵬.數(shù)據(jù)庫(kù)更新丟失解決方案.IT/計(jì)算.[2011-08-10].

      [6] 孟憲虎,馬雪英,鄧緒斌.大型數(shù)據(jù)庫(kù)管理系統(tǒng)技術(shù)、應(yīng)用與實(shí)例分析——基于SQL Server 2005[M]. 2版.北京:電子工業(yè)出版社,2011:119-137

      [7] 李萍,黃可望,黃能耿.SQL Server 數(shù)據(jù)庫(kù)應(yīng)用及實(shí)訓(xùn)[M].1版.無(wú)錫職業(yè)技術(shù)學(xué)院,2014:96-102.endprint

      猜你喜歡
      數(shù)據(jù)庫(kù)
      本刊加入數(shù)據(jù)庫(kù)的聲明
      數(shù)據(jù)庫(kù)
      數(shù)據(jù)庫(kù)
      數(shù)據(jù)庫(kù)
      兩種新的非確定數(shù)據(jù)庫(kù)上的Top-K查詢(xún)
      數(shù)據(jù)庫(kù)
      數(shù)據(jù)庫(kù)
      數(shù)據(jù)庫(kù)
      數(shù)據(jù)庫(kù)
      數(shù)據(jù)庫(kù)
      敦煌市| 彭泽县| 奉化市| 城市| 东港市| 凤翔县| 和田县| 攀枝花市| 黎川县| 陈巴尔虎旗| 介休市| 上高县| 崇左市| 永德县| 嵩明县| 会宁县| 稷山县| 油尖旺区| 通化县| 巫山县| 宜兰县| 栾川县| 娱乐| 卢氏县| 舞钢市| 津南区| 佛学| 九龙城区| 长寿区| 清丰县| 绍兴县| 静安区| 南投市| 遵义县| 永丰县| 大宁县| 荔浦县| 依兰县| 洛川县| 武陟县| 左权县|