如何正確操作ADO數(shù)據(jù)庫創(chuàng)建說明
在公司技術(shù)人員進(jìn)行對ADO數(shù)據(jù)庫操作時(shí),特別是企業(yè)級的數(shù)據(jù)庫應(yīng)用,就不得不提一個(gè)多人操作時(shí)經(jīng)常會產(chǎn)生的問題——并發(fā)沖突。本文首先來看一下什么是并發(fā)沖突,傳統(tǒng)的并發(fā)沖突有現(xiàn)有的處理方式。
一、要完成本文中的實(shí)例,您需要作如下準(zhǔn)備:
將Visual Studio 2008及.NET Framework 3.5升級到SP1。點(diǎn)擊轉(zhuǎn)到升級地址。 安裝SQL SERVER 2005,VS 2008中自帶的EXPRESS版的SQL SERVER應(yīng)該也可以用。 下載并附加數(shù)據(jù)庫:點(diǎn)擊下載DemoDbV2。 創(chuàng)建一個(gè)VB Console Application,并且取一個(gè)合適的名字(例如:Concurrency之類的)。注意,目標(biāo)Framework要設(shè)置成3.5版。
二、什么是并發(fā)沖突
讓我們來看一個(gè)跟取款相關(guān)的例子:某年某月某日某時(shí)某分,ADO數(shù)據(jù)庫老王在A取款機(jī)取錢,他兒子小王同時(shí)在B取款機(jī)取錢(不要問我為什么這么巧^_^),他倆從同一個(gè)賬號上取。于是就發(fā)生了如下一序列的操作:
A取款機(jī)向中央數(shù)據(jù)庫提問:這賬上還有多少錢?
B取款機(jī)向中央數(shù)據(jù)庫詢問:這賬上還有多少錢? 中央數(shù)據(jù)庫回答A取款機(jī):2W,中央數(shù)據(jù)庫回答B(yǎng)取款機(jī):2W,然后,ADO數(shù)據(jù)庫老王對A取款機(jī)說:我要取出1.5W。 同時(shí),小王對B取款機(jī)說:我要取出1.8W。 #t#
A取款機(jī)就算了一下,2W-1.5W=0.5W>0,于是就吐出1.5W現(xiàn)金給了老王,并且準(zhǔn)備告訴中央數(shù)據(jù)庫,現(xiàn)在還剩0.5W啦。但是,就在它告訴中央數(shù)據(jù)庫之前,發(fā)生了以下的事情:
B取款機(jī)計(jì)算了一下,2W(此時(shí),它還不知道余額已經(jīng)成0.5W了,因?yàn)锳取款機(jī)還沒有告訴中央數(shù)據(jù)庫)減去1.8W等于0.2W大于0,于是就吐出1.8W現(xiàn)金給了小王。然后,ADO數(shù)據(jù)庫當(dāng)然也要知會中央數(shù)據(jù)庫。
中央數(shù)據(jù)庫于是收到A取款機(jī)的消息,說,這個(gè)賬號還剩0.5W,于是刷新余額為0.5W。然后又收到B取款機(jī)說還剩0.2W,于是,就刷新余額為0.2W。 呵呵,于是,小王+老王的賬戶里一共存有2W元,結(jié)果老王取了1.5W元,小王取了1.8W元,賬戶里卻還剩了0.2W元。
這就是一種并發(fā)沖突,由于同一時(shí)間有兩個(gè)或者多個(gè)端在對同一數(shù)據(jù)進(jìn)行操作,ADO數(shù)據(jù)庫從而導(dǎo)致數(shù)據(jù)發(fā)生了錯誤。如果取款機(jī)真的以這樣的方式來處理并發(fā),那么,我現(xiàn)在就不寫這片文章了——趕緊發(fā)動全家對表,說好了在某一時(shí)刻同時(shí)取錢去。