超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Sqlserver2000中的并發(fā)問(wèn)題

admin
2011年3月3日 16:34 本文熱度 3830
sqlserver2000中的并發(fā)問(wèn)題一、并發(fā)問(wèn)題的產(chǎn)生:
如果沒(méi)有鎖定且多個(gè)用戶同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),則當(dāng)他們的事務(wù)同時(shí)使用相同的數(shù)據(jù)時(shí)可能會(huì)發(fā)生問(wèn)題。并發(fā)問(wèn)題包括:
丟失或覆蓋更新。未確認(rèn)的相關(guān)性(臟讀)。不一致的分析(非重復(fù)讀)?;孟褡x。 1、丟失更新:當(dāng)兩個(gè)或多個(gè)事務(wù)選擇同一行,然后基于最初選定的值更新該行時(shí),會(huì)發(fā)生丟失更新問(wèn)題。每個(gè)事務(wù)都不知道其它事務(wù)的存在。最后的更新將重寫由其它事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)丟失。
例如,兩個(gè)編輯人員制作了同一文檔的電子復(fù)本。每個(gè)編輯人員獨(dú)立地更改其復(fù)本,然后保存更改后的復(fù)本,這樣就覆蓋了原始文檔。最后保存其更改復(fù)本的編輯人員覆蓋了第一個(gè)編輯人員所做的更改。如果在第一個(gè)編輯人員完成之后第二個(gè)編輯人員才能進(jìn)行更改,則可以避免該問(wèn)題。
2、未確認(rèn)的相關(guān)性(臟讀)
當(dāng)?shù)诙€(gè)事務(wù)選擇其它事務(wù)正在更新的行時(shí),會(huì)發(fā)生未確認(rèn)的相關(guān)性問(wèn)題。第二個(gè)事務(wù)正在讀取的數(shù)據(jù)還沒(méi)有確認(rèn)并且可能由更新此行的事務(wù)所更改。

例如,一個(gè)編輯人員正在更改電子文檔。在更改過(guò)程中,另一個(gè)編輯人員復(fù)制了該文檔(該復(fù)本包含到目前為止所做的全部更改)并將其分發(fā)給預(yù)期的用戶。此后,第一個(gè)編輯人員認(rèn)為目前所做的更改是錯(cuò)誤的,于是刪除了所做的編輯并保存了文檔。分發(fā)給用戶的文檔包含不再存在的編輯內(nèi)容,并且這些編輯內(nèi)容應(yīng)認(rèn)為從未存在過(guò)。如果在第一個(gè)編輯人員確定最終更改前任何人都不能讀取更改的文檔,則可以避免該問(wèn)題。
3、不一致的分析(非重復(fù)讀)
當(dāng)?shù)诙€(gè)事務(wù)多次訪問(wèn)同一行而且每次讀取不同的數(shù)據(jù)時(shí),會(huì)發(fā)生不一致的分析問(wèn)題。不一致的分析與未確認(rèn)的相關(guān)性類似,因?yàn)槠渌聞?wù)也是正在更改第二個(gè)事務(wù)正在讀取的數(shù)據(jù)。然而,在不一致的分析中,第二個(gè)事務(wù)讀取的數(shù)據(jù)是由已進(jìn)行了更改的事務(wù)提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務(wù)更改;因而該行被非重復(fù)讀取。

例如,一個(gè)編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時(shí),文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問(wèn)題。
4、幻像讀
當(dāng)對(duì)某行執(zhí)行插入或刪除操作,而該行屬于某個(gè)事務(wù)正在讀取的行的范圍時(shí),會(huì)發(fā)生幻像讀問(wèn)題。事務(wù)第一次讀的行范圍顯示出其中一行已不復(fù)存在于第二次讀或后續(xù)讀中,因?yàn)樵撔幸驯黄渌聞?wù)刪除。同樣,由于其它事務(wù)的插入操作,事務(wù)的第二次或后續(xù)讀顯示有一行已不存在于原始讀中。

例如,一個(gè)編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí),發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對(duì)原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問(wèn)題。
二、并發(fā)問(wèn)題的解決方案:
當(dāng)鎖定用作并發(fā)控制機(jī)制時(shí),它可以解決并發(fā)問(wèn)題。這使所有事務(wù)得以在彼此完全隔離的環(huán)境中運(yùn)行,但是任何時(shí)候都可以有多個(gè)正在運(yùn)行的事務(wù)。

可串行性是通過(guò)運(yùn)行一組并發(fā)事務(wù)達(dá)到的數(shù)據(jù)庫(kù)狀態(tài),等同于這組事務(wù)按某種順序連續(xù)執(zhí)行時(shí)所達(dá)到的數(shù)據(jù)庫(kù)狀態(tài)。
sql-92 隔離級(jí)別
盡管可串行性對(duì)于事務(wù)確保數(shù)據(jù)庫(kù)中的數(shù)據(jù)在所有時(shí)間內(nèi)的正確性相當(dāng)重要,然而許多事務(wù)并不總是要求完全的隔離。例如,多個(gè)作者工作于同一本書(shū)的不同章節(jié)。新章節(jié)可以在任意時(shí)候提交到項(xiàng)目中。但是,對(duì)于已經(jīng)編輯過(guò)的章節(jié),沒(méi)有編輯人員的批準(zhǔn),作者不能對(duì)此章節(jié)進(jìn)行任何更改。這樣,盡管有未編輯的新章節(jié),但編輯人員仍可以確保在任意時(shí)間該書(shū)籍項(xiàng)目的正確性。編輯人員可以查看以前編輯的章節(jié)以及最近提交的章節(jié)。

事務(wù)準(zhǔn)備接受不一致數(shù)據(jù)的級(jí)別稱為隔離級(jí)別。隔離級(jí)別是一個(gè)事務(wù)必須與其它事務(wù)進(jìn)行隔離的程度。較低的隔離級(jí)別可以增加并發(fā),但代價(jià)是降低數(shù)據(jù)的正確性。相反,較高的隔離級(jí)別可以確保數(shù)據(jù)的正確性,但可能對(duì)并發(fā)產(chǎn)生負(fù)面影響。應(yīng)用程序要求的隔離級(jí)別確定了 sql server 使用的鎖定行為。

sql-92 定義了下列四種隔離級(jí)別,sql server 支持所有這些隔離級(jí)別:
未提交讀(事務(wù)隔離的最低級(jí)別,僅可保證不讀取物理?yè)p壞的數(shù)據(jù))。提交讀(sql server 默認(rèn)級(jí)別)。可重復(fù)讀??纱凶x(事務(wù)隔離的最高級(jí)別,事務(wù)之間完全隔離)。
如果事務(wù)在可串行讀隔離級(jí)別上運(yùn)行,則可以保證任何并發(fā)重疊事務(wù)均是串行的。

下面四種隔離級(jí)別允許不同類型的行為。

隔離級(jí)別

臟讀

不可重復(fù)讀取

幻像

 

 

未提交讀







提交讀







可重復(fù)讀







可串行讀







 

事務(wù)必須運(yùn)行于可重復(fù)讀或更高的隔離級(jí)別以防止丟失更新。當(dāng)兩個(gè)事務(wù)檢索相同的行,然后基于原檢索的值對(duì)行進(jìn)行更新時(shí),會(huì)發(fā)生丟失更新。如果兩個(gè)事務(wù)使用一個(gè) update 語(yǔ)句更新行,并且不基于以前檢索的值進(jìn)行更新,則在默認(rèn)的提交讀隔離級(jí)別不會(huì)發(fā)生丟失更新。

三、問(wèn)題解決的實(shí)現(xiàn):
1、       默認(rèn)解決方案:set transaction isolation level
控制由連接發(fā)出的所有 microsoft® sql server™ select 語(yǔ)句的默認(rèn)事務(wù)鎖定行為。
語(yǔ)法
set transaction isolation level
    { read committed
        | read uncommitted
        | repeatable read
        | serializable
    }
參數(shù)
read committed

指定在讀取數(shù)據(jù)時(shí)控制共享鎖以避免臟讀,但數(shù)據(jù)可在事務(wù)結(jié)束前更改,從而產(chǎn)生不可重復(fù)讀取或幻像數(shù)據(jù)。該選項(xiàng)是 sql server 的默認(rèn)值。

read uncommitted

執(zhí)行臟讀或 0 級(jí)隔離鎖定,這表示不發(fā)出共享鎖,也不接受排它鎖。當(dāng)設(shè)置該選項(xiàng)時(shí),可以對(duì)數(shù)據(jù)執(zhí)行未提交讀或臟讀;在事務(wù)結(jié)束前可以更改數(shù)據(jù)內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)集消失。該選項(xiàng)的作用與在事務(wù)內(nèi)所有語(yǔ)句中的所有表上設(shè)置 nolock 相同。這是四個(gè)隔離級(jí)別中限制最小的級(jí)別。

repeatable read

鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新數(shù)據(jù),但是其他用戶可以將新的幻像行插入數(shù)據(jù)集,且幻像行包括在當(dāng)前事務(wù)的后續(xù)讀取中。因?yàn)椴l(fā)低于默認(rèn)隔離級(jí)別,所以應(yīng)只在必要時(shí)才使用該選項(xiàng)。

serializable

在數(shù)據(jù)集上放置一個(gè)范圍鎖,以防止其他用戶在事務(wù)完成之前更新數(shù)據(jù)集或?qū)⑿胁迦霐?shù)據(jù)集內(nèi)。這是四個(gè)隔離級(jí)別中限制最大的級(jí)別。因?yàn)椴l(fā)級(jí)別較低,所以應(yīng)只在必要時(shí)才使用該選項(xiàng)。該選項(xiàng)的作用與在事務(wù)內(nèi)所有 select 語(yǔ)句中的所有表上設(shè)置 holdlock 相同。
注釋
一次只能設(shè)置這些選項(xiàng)中的一個(gè),而且設(shè)置的選項(xiàng)將一直對(duì)那個(gè)連接保持有效,直到顯式更改該選項(xiàng)為止。這是默認(rèn)行為,除非在語(yǔ)句的 from 子句中在表級(jí)上指定優(yōu)化選項(xiàng)。

set transaction isolation level 的設(shè)置是在執(zhí)行或運(yùn)行時(shí)設(shè)置,而不是在分析時(shí)設(shè)置。
示例
下例為會(huì)話設(shè)置 transaction isolation level。對(duì)于每個(gè)后續(xù) transact-sql 語(yǔ)句,sql server 將所有共享鎖一直控制到事務(wù)結(jié)束為止。

set transaction isolation level repeatable read

go

begin transaction

select * from publishers

select * from authors

...

commit transaction
2、自定義事務(wù)隔離級(jí)別
默認(rèn)情況下,microsoft® sql server™ 2000 在 read committed 的一個(gè)隔離級(jí)別上操作。但是,應(yīng)用程序可能必須運(yùn)行于不同的隔離級(jí)別。若要在應(yīng)用程序中使用更嚴(yán)格或較寬松的隔離級(jí)別,可以通過(guò)使用 set transaction isolation level 語(yǔ)句設(shè)置會(huì)話的隔離級(jí)別,來(lái)自定義整個(gè)會(huì)話的鎖定。

指定隔離級(jí)別后,sql server 會(huì)話中所有 select 語(yǔ)句的鎖定行為都運(yùn)行于該隔離級(jí)別上,并一直保持有效直到會(huì)話終止或者將隔離級(jí)別設(shè)置為另一個(gè)級(jí)別。例如,若要設(shè)置事務(wù)隔離級(jí)別為可串行讀,以確保并發(fā)事務(wù)不能在 authors 表中插入幻像行,請(qǐng)執(zhí)行:

use pubs

go

set transaction isolation level serializable

go

begin transaction

select au_lname from authors



說(shuō)明  如果必要,可以通過(guò)指定表級(jí)鎖定提示來(lái)替代單個(gè) select 語(yǔ)句的隔離級(jí)別。指定表級(jí)鎖定提示不會(huì)影響會(huì)話中的其它語(yǔ)句。建議僅在絕對(duì)必要時(shí)才使用表級(jí)鎖定提示更改默認(rèn)的鎖定行為。

若要確定當(dāng)前設(shè)置的事務(wù)隔離級(jí)別,請(qǐng)使用 dbcc useroptions 語(yǔ)句,例如:

use pubs

go

set transaction isolation level repeatable read

go

dbcc useroptions

go

set option

value

textsize

4096

language

us_english

dateformat

mdy

datefirst

7

isolation level

repeatable read

 

(5 rows affected)

dbcc execution completed. if dbcc printed error messages, see your system administrator.
3、調(diào)整事務(wù)隔離級(jí)別
隔離屬性是 acid 的四個(gè)屬性之一,邏輯工作單元必須具備這四個(gè)屬性才能稱為事務(wù)。該屬性能夠使事務(wù)免受其它并發(fā)事務(wù)所執(zhí)行的更新的影響。每個(gè)事務(wù)的隔離級(jí)別實(shí)際上都是可以自定義的。

microsoft® sql server™ 支持 sql-92 中定義的事務(wù)隔離級(jí)別。設(shè)置事務(wù)隔離級(jí)別雖然使程序員承擔(dān)了某些完整性問(wèn)題所帶來(lái)的風(fēng)險(xiǎn),但可以換取對(duì)數(shù)據(jù)更大的并發(fā)訪問(wèn)權(quán)。與以前的隔離級(jí)別相比,每個(gè)隔離級(jí)別都提供了更大的隔離性,但這是通過(guò)在更長(zhǎng)的時(shí)間內(nèi)占用更多限制鎖換來(lái)的。事務(wù)隔離級(jí)別有:
read uncommittedread committedrepeatable readserializable
可以使用 transact-sql 或通過(guò)數(shù)據(jù)庫(kù) api 來(lái)設(shè)置事務(wù)隔離級(jí)別:

transact-sql

transact-sql 腳本和 db-library 應(yīng)用程序使用 set transaction isolation level 語(yǔ)句。

ado

ado 應(yīng)用程序?qū)?connection 對(duì)象的 isolationlevel 屬性設(shè)置為 adxactreaduncommitted、adxactreadcommitted、adxactrepeatableread 或 adxactreadserializable。

ole db

ole db 應(yīng)用程序調(diào)用 itransactionlocal::starttransaction,其中 isolevel 設(shè)置為 isolationlevel_readuncommitted、isolationlevel_readcommitted、isolationlevel_repeatableread 或 isolationlevel_serializable。

odbc

odbc 應(yīng)用程序調(diào)用 sqlsetconnectattr,其中 attribute 設(shè)置為 sql_attr_txn_isolation,valueptr 設(shè)置為 sql_txn_read_uncommitted、sql_txn_read_committed、sql_txn_repeatable_read 或 sql_txn_serializable。

該文章在 2011/3/3 16:34:49 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved