-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
未提交讀
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于未提交讀的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、如何在事務(wù)還未提交的時(shí)候讀取已經(jīng)進(jìn)行插入操作的中間數(shù)據(jù)
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀)
二、
三、
四、急求:WINDOWS里的出現(xiàn)的錯(cuò)誤解決方法
[導(dǎo)讀: 各種大型數(shù)據(jù)庫(kù)所采用的鎖的基本理論是一致的,但在具體實(shí)現(xiàn)上各有差別。SQL Server更強(qiáng)調(diào)由系統(tǒng)來(lái)管理鎖。在用戶有SQL請(qǐng)求時(shí),系統(tǒng)分析請(qǐng)求,自動(dòng)在滿足鎖定條件和系統(tǒng)性能之間為數(shù)據(jù)庫(kù)加上適當(dāng)?shù)逆i,同時(shí)系統(tǒng)在運(yùn)行期間常常自動(dòng)進(jìn)行優(yōu)化處理,實(shí)行動(dòng)態(tài)加鎖。對(duì)于一般的用戶而言,通過(guò)系統(tǒng)的自動(dòng)鎖定管理機(jī)制基本可以滿足使用要求,但如果對(duì)數(shù)據(jù)安全、數(shù)據(jù)庫(kù)完整性和一致性有特殊要求,就需要了解SQL Server的鎖機(jī)制,掌握數(shù)據(jù)庫(kù)鎖定方法。]
鎖是數(shù)據(jù)庫(kù)中的一個(gè)非常重要的概念,它主要用于多用戶環(huán)境下保證數(shù)據(jù)庫(kù)完整性和一致性。 我們知道,多個(gè)用戶能夠同時(shí)操縱同一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),會(huì)發(fā)生數(shù)據(jù)不一致現(xiàn)象。即如果沒(méi)有鎖定且多個(gè)用戶同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),則當(dāng)他們的事務(wù)同時(shí)使用相同的數(shù)據(jù)時(shí)可能會(huì)發(fā)生問(wèn)題。這些問(wèn)題包括:丟失更新、臟讀、不可重復(fù)讀和幻覺(jué)讀:
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. 臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。例如,一個(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ù)讀是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。例如,一個(gè)編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時(shí),文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問(wèn)題。
4.幻覺(jué)讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒(méi)有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺(jué)一樣。例如,一個(gè)編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí),發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對(duì)原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問(wèn)題。
所以,處理多用戶并發(fā)訪問(wèn)的方法是加鎖。鎖是防止其他事務(wù)訪問(wèn)指定的資源控制、實(shí)現(xiàn)并發(fā)控制的一種主要手段。當(dāng)一個(gè)用戶鎖住數(shù)據(jù)庫(kù)中的某個(gè)對(duì)象時(shí),其他用戶就不能再訪問(wèn)該對(duì)象。加鎖對(duì)并發(fā)訪問(wèn)的影響體現(xiàn)在鎖的粒度上。為了控制鎖定的資源,應(yīng)該首先了解系統(tǒng)的空間管理。在SQL Server 2000系統(tǒng)中,最小的空間管理單位是頁(yè),一個(gè)頁(yè)有8K。所有的數(shù)據(jù)、日志、索引都存放在頁(yè)上。另外,使用頁(yè)有一個(gè)限制,這就是表中的一行數(shù)據(jù)必須在同一個(gè)頁(yè)上,不能跨頁(yè)。頁(yè)上面的空間管理單位是盤區(qū),一個(gè)盤區(qū)是8個(gè)連續(xù)的頁(yè)。表和索引的最小占用單位是盤區(qū)。數(shù)據(jù)庫(kù)是由一個(gè)或者多個(gè)表或者索引組成,即是由多個(gè)盤區(qū)組成。放在一個(gè)表上的鎖限制對(duì)整個(gè)表的并發(fā)訪問(wèn);放在盤區(qū)上的鎖限制了對(duì)整個(gè)盤區(qū)的訪問(wèn);放在數(shù)據(jù)頁(yè)上的鎖限制了對(duì)整個(gè)數(shù)據(jù)頁(yè)的訪問(wèn);放在行上的鎖只限制對(duì)該行的并發(fā)訪問(wèn)。
SQL Server 2000 具有多粒度鎖定,允許一個(gè)事務(wù)鎖定不同類型的的資源。為了使鎖定的成本減至最少,SQL Server 自動(dòng)將資源鎖定在適合任務(wù)的級(jí)別。鎖定在較小的粒度(例如行)可以增加并發(fā)但需要較大的開銷,因?yàn)槿绻i定了許多行,則需要控制更多的鎖。鎖定在較大的粒度(例如表)就并發(fā)而言是相當(dāng)昂貴的,因?yàn)殒i定整個(gè)表限制了其它事務(wù)對(duì)表中任意部分進(jìn)行訪問(wèn),但要求的開銷較低,因?yàn)樾枰S護(hù)的鎖較少。SQL Server 可以鎖定行、頁(yè)、擴(kuò)展盤區(qū)、表、庫(kù)等資源。
行是可以鎖定的最小空間, 行級(jí)鎖占用的數(shù)據(jù)資源最少,所以在事務(wù)的處理過(guò)程中,允許其他事務(wù)繼續(xù)操縱同一個(gè)表或者同一個(gè)頁(yè)的其他數(shù)據(jù),大大降低了其他事務(wù)等待處理的時(shí)間,提高了系統(tǒng)的并發(fā)性。
頁(yè)級(jí)鎖是指在事務(wù)的操縱過(guò)程中,無(wú)論事務(wù)處理數(shù)據(jù)的多少,每一次都鎖定一頁(yè),在這個(gè)頁(yè)上的數(shù)據(jù)不能被其他事務(wù)操縱。在SQL Server 7.0以前,使用的是頁(yè)級(jí)鎖。頁(yè)級(jí)鎖鎖定的資源比行級(jí)鎖鎖定的數(shù)據(jù)資源多。在頁(yè)級(jí)鎖中,即使是一個(gè)事務(wù)只操縱頁(yè)上的一行數(shù)據(jù),那么該頁(yè)上的其他數(shù)據(jù)行也不能被其他事務(wù)使用。因此,當(dāng)使用頁(yè)級(jí)鎖時(shí),會(huì)出現(xiàn)數(shù)據(jù)的浪費(fèi)現(xiàn)象,也就是說(shuō),在同一個(gè)頁(yè)上會(huì)出現(xiàn)數(shù)據(jù)被占用卻沒(méi)有使用的現(xiàn)象。在這種現(xiàn)象中,數(shù)據(jù)的浪費(fèi)最多不超過(guò)一個(gè)頁(yè)上的數(shù)據(jù)行。
表級(jí)鎖也是一個(gè)非常重要的鎖。表級(jí)鎖是指事務(wù)在操縱某一個(gè)表的數(shù)據(jù)時(shí),鎖定了這個(gè)數(shù)據(jù)所在的整個(gè)表,其他事務(wù)不能訪問(wèn)該表中的其他數(shù)據(jù)。當(dāng)事務(wù)處理的數(shù)據(jù)量比較大時(shí),一般使用表級(jí)鎖。表級(jí)鎖的特點(diǎn)是使用比較少的系統(tǒng)資源,但是卻占用比較多的數(shù)據(jù)資源。與行級(jí)鎖和頁(yè)級(jí)鎖相比,表級(jí)鎖占用的系統(tǒng)資源例如內(nèi)存比較少,但是占用的數(shù)據(jù)資源卻是最大。在表級(jí)鎖時(shí),有可能出現(xiàn)數(shù)據(jù)的大量浪費(fèi)現(xiàn)象,因?yàn)楸砑?jí)鎖鎖定整個(gè)表,那么其他的事務(wù)都不能操縱表中的其他數(shù)據(jù)。
盤區(qū)鎖是一種特殊類型的鎖,只能用在一些特殊的情況下。簇級(jí)鎖就是指事務(wù)占用一個(gè)盤區(qū),這個(gè)盤區(qū)不能同時(shí)被其他事務(wù)占用。例如在創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建表時(shí),系統(tǒng)分配物理空間時(shí)使用這種類型的鎖。系統(tǒng)是按照盤區(qū)分配空間的。當(dāng)系統(tǒng)分配空間時(shí),使用盤區(qū)鎖,防止其他事務(wù)同時(shí)使用同一個(gè)盤區(qū)。當(dāng)系統(tǒng)完成分配空間之后,就不再使用這種類型的盤區(qū)鎖。特別是,當(dāng)涉及到對(duì)數(shù)據(jù)操作的事務(wù)時(shí),不使用盤區(qū)鎖。
數(shù)據(jù)庫(kù)級(jí)鎖是指鎖定整個(gè)數(shù)據(jù)庫(kù),防止任何用戶或者事務(wù)對(duì)鎖定的數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)。數(shù)據(jù)庫(kù)級(jí)鎖是一種非常特殊的鎖,它只是用于數(shù)據(jù)庫(kù)的恢復(fù)操作過(guò)程中。這種等級(jí)的鎖是一種最高等級(jí)的鎖,因?yàn)樗刂普麄€(gè)數(shù)據(jù)庫(kù)的操作。只要對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)操作,那么就需要設(shè)置數(shù)據(jù)庫(kù)為單用戶模式,這樣系統(tǒng)就能防止其他用戶對(duì)該數(shù)據(jù)庫(kù)進(jìn)行各種操作。
行級(jí)鎖是一種最優(yōu)鎖,因?yàn)樾屑?jí)鎖不可能出現(xiàn)數(shù)據(jù)既被占用又沒(méi)有使用的浪費(fèi)現(xiàn)象。但是,如果用戶事務(wù)中頻繁對(duì)某個(gè)表中的多條記錄操作,將導(dǎo)致對(duì)該表的許多記錄行都加上了行級(jí)鎖,數(shù)據(jù)庫(kù)系統(tǒng)中鎖的數(shù)目會(huì)急劇增加,這樣就加重了系統(tǒng)負(fù)荷,影響系統(tǒng)性能。因此,在SQL Server中,還支持鎖升級(jí)(lock escalation)。所謂鎖升級(jí)是指調(diào)整鎖的粒度,將多個(gè)低粒度的鎖替換成少數(shù)的更高粒度的鎖,以此來(lái)降低系統(tǒng)負(fù)荷。在SQL Server中當(dāng)一個(gè)事務(wù)中的鎖較多,達(dá)到鎖升級(jí)門限時(shí),系統(tǒng)自動(dòng)將行級(jí)鎖和頁(yè)面鎖升級(jí)為表級(jí)鎖。特別值得注意的是,在SQL Server中,鎖的升級(jí)門限以及鎖升級(jí)是由系統(tǒng)自動(dòng)來(lái)確定的,不需要用戶設(shè)置。
在SQL Server數(shù)據(jù)庫(kù)中加鎖時(shí),除了可以對(duì)不同的資源加鎖,還可以使用不同程度的加鎖方式,即鎖有多種模式,SQL Server中鎖模式包括:
1.共享鎖 SQL Server中,共享鎖用于所有的只讀數(shù)據(jù)操作。共享鎖是非獨(dú)占的,允許多個(gè)并發(fā)事務(wù)讀取其鎖定的資源。默認(rèn)情況下,數(shù)據(jù)被讀取后,SQL Server立即釋放共享鎖。例如,執(zhí)行查詢“SELECT * FROM AUTHORS”時(shí),首先鎖定第一頁(yè),讀取之后,釋放對(duì)第一頁(yè)的鎖定,然后鎖定第二頁(yè)。這樣,就允許在讀操作過(guò)程中,修改未被鎖定的第一頁(yè)。但是,事務(wù)隔離級(jí)別連接選項(xiàng)設(shè)置和SELECT語(yǔ)句中的鎖定設(shè)置都可以改變SQL Server的這種默認(rèn)設(shè)置。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整個(gè)查詢過(guò)程中,保持對(duì)表的鎖定,直到查詢完成才釋放鎖定。
2.更新鎖 更新鎖在修改操作的初始化階段用來(lái)鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現(xiàn)象。因?yàn)槭褂霉蚕礞i時(shí),修改數(shù)據(jù)的操作分為兩步,首先獲得一個(gè)共享鎖,讀取數(shù)據(jù),然后將共享鎖升級(jí)為排它鎖,然后再執(zhí)行修改操作。這樣如果同時(shí)有兩個(gè)或多個(gè)事務(wù)同時(shí)對(duì)一個(gè)事務(wù)申請(qǐng)了共享鎖,在修改數(shù)據(jù)的時(shí)候,這些事務(wù)都要將共享鎖升級(jí)為排它鎖。這時(shí),這些事務(wù)都不會(huì)釋放共享鎖而是一直等待對(duì)方釋放,這樣就造成了死鎖。如果一個(gè)數(shù)據(jù)在修改前直接申請(qǐng)更新鎖,在數(shù)據(jù)修改的時(shí)候再升級(jí)為排它鎖,就可以避免死鎖。
3.排它鎖 排它鎖是為修改數(shù)據(jù)而保留的。它所鎖定的資源,其他事務(wù)不能讀取也不能修改。
4.結(jié)構(gòu)鎖 執(zhí)行表的數(shù)據(jù)定義語(yǔ)言 (DDL) 操作(例如添加列或除去表)時(shí)使用架構(gòu)修改 (Sch-M) 鎖。當(dāng)編譯查詢時(shí),使用架構(gòu)穩(wěn)定性 (Sch-S) 鎖。架構(gòu)穩(wěn)定性 (Sch-S) 鎖不阻塞任何事務(wù)鎖,包括排它鎖。因此在編譯查詢時(shí),其它事務(wù)(包括在表上有排它鎖的事務(wù))都能繼續(xù)運(yùn)行。但不能在表上執(zhí)行 DDL 操作。
5.意向鎖 意向鎖說(shuō)明SQL Server有在資源的低層獲得共享鎖或排它鎖的意向。例如,表級(jí)的共享意向鎖說(shuō)明事務(wù)意圖將排它鎖釋放到表中的頁(yè)或者行。意向鎖又可以分為共享意向鎖、獨(dú)占意向鎖和共享式獨(dú)占意向鎖。共享意向鎖說(shuō)明事務(wù)意圖在共享意向鎖所鎖定的低層資源上放置共享鎖來(lái)讀取數(shù)據(jù)。獨(dú)占意向鎖說(shuō)明事務(wù)意圖在共享意向鎖所鎖定的低層資源上放置排它鎖來(lái)修改數(shù)據(jù)。共享式排它鎖說(shuō)明事務(wù)允許其他事務(wù)使用共享鎖來(lái)讀取頂層資源,并意圖在該資源低層上放置排它鎖。
6.大容量更新鎖 當(dāng)將數(shù)據(jù)大容量復(fù)制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 設(shè)置了 table lock on bulk 表選項(xiàng)時(shí),將使用大容量更新 鎖。大容量更新鎖允許進(jìn)程將數(shù)據(jù)并發(fā)地大容量復(fù)制到同一表,同時(shí)防止其它不進(jìn)行大容量復(fù)制數(shù)據(jù)的進(jìn)程訪問(wèn)該表。
SQL Server系統(tǒng)中建議讓系統(tǒng)自動(dòng)管理鎖,該系統(tǒng)會(huì)分析用戶的SQL語(yǔ)句要求,自動(dòng)為該請(qǐng)求加上合適的鎖,而且在鎖的數(shù)目太多時(shí),系統(tǒng)會(huì)自動(dòng)進(jìn)行鎖升級(jí)。如前所述,升級(jí)的門限由系統(tǒng)自動(dòng)配置,并不需要用戶配置。 在實(shí)際應(yīng)用中,有時(shí)為了應(yīng)用程序正確運(yùn)行和保持?jǐn)?shù)據(jù)的一致性,必須人為地給數(shù)據(jù)庫(kù)的某個(gè)表加鎖。比如,在某應(yīng)用程序的一個(gè)事務(wù)操作中,需要根據(jù)一編號(hào)對(duì)幾個(gè)數(shù)據(jù)表做統(tǒng)計(jì)操作,為保證統(tǒng)計(jì)數(shù)據(jù)時(shí)間的一致性和正確性,從統(tǒng)計(jì)第一個(gè)表開始到全部表結(jié)束,其他應(yīng)用程序或事務(wù)不能再對(duì)這幾個(gè)表寫入數(shù)據(jù),這個(gè)時(shí)候,該應(yīng)用程序希望在從統(tǒng)計(jì)第一個(gè)數(shù)據(jù)表開始或在整個(gè)事務(wù)開始時(shí)能夠由程序人為地(顯式地)鎖定這幾個(gè)表,這就需要用到手工加鎖(也稱顯式加鎖)技術(shù)。
可以使用 SELECT、INSERT、UPDATE 和 DELETE 語(yǔ)句指定表級(jí)鎖定提示的范圍,以引導(dǎo) Microsoft SQL Server 2000 使用所需的鎖類型。當(dāng)需要對(duì)對(duì)象所獲得鎖類型進(jìn)行更精細(xì)控制時(shí),使用表級(jí)鎖定提示更改默認(rèn)的鎖定行為。
所指定的表級(jí)鎖定提示有如下幾種:
1. HOLDLOCK: 在該表上保持共享鎖,直到整個(gè)事務(wù)結(jié)束,而不是在語(yǔ)句執(zhí)行完立即釋放所添加的鎖。
2. NOLOCK:不添加共享鎖和排它鎖,當(dāng)這個(gè)選項(xiàng)生效后,可能讀到未提交讀的數(shù)據(jù)或“臟數(shù)據(jù)”,這個(gè)選項(xiàng)僅僅應(yīng)用于SELECT語(yǔ)句。
3. PAGLOCK:指定添加頁(yè)鎖(否則通??赡芴砑颖礞i)。
4. READCOMMITTED用與運(yùn)行在提交讀隔離級(jí)別的事務(wù)相同的鎖語(yǔ)義執(zhí)行掃描。默認(rèn)情況下,SQL Server 2000 在此隔離級(jí)別上操作。。
5. READPAST: 跳過(guò)已經(jīng)加鎖的數(shù)據(jù)行,這個(gè)選項(xiàng)將使事務(wù)讀取數(shù)據(jù)時(shí)跳過(guò)那些已經(jīng)被其他事務(wù)鎖定的數(shù)據(jù)行,而不是阻塞直到其他事務(wù)釋放鎖,READPAST僅僅應(yīng)用于READ COMMITTED隔離性級(jí)別下事務(wù)操作中的SELECT語(yǔ)句操作。
6. READUNCOMMITTED:等同于NOLOCK。
7. REPEATABLEREAD:設(shè)置事務(wù)為可重復(fù)讀隔離性級(jí)別。
8. ROWLOCK:使用行級(jí)鎖,而不使用粒度更粗的頁(yè)級(jí)鎖和表級(jí)鎖。
9. SERIALIZABLE:用與運(yùn)行在可串行讀隔離級(jí)別的事務(wù)相同的鎖語(yǔ)義執(zhí)行掃描。等同于 HOLDLOCK。
10. TABLOCK:指定使用表級(jí)鎖,而不是使用行級(jí)或頁(yè)面級(jí)的鎖,SQL Server在該語(yǔ)句執(zhí)行完后釋放這個(gè)鎖,而如果同時(shí)指定了HOLDLOCK,該鎖一直保持到這個(gè)事務(wù)結(jié)束。
11. TABLOCKX:指定在表上使用排它鎖,這個(gè)鎖可以阻止其他事務(wù)讀或更新這個(gè)表的數(shù)據(jù),直到這個(gè)語(yǔ)句或整個(gè)事務(wù)結(jié)束。
12. UPDLOCK :指定在讀表中數(shù)據(jù)時(shí)設(shè)置更新 鎖(update lock)而不是設(shè)置共享鎖,該鎖一直保持到這個(gè)語(yǔ)句或整個(gè)事務(wù)結(jié)束,使用UPDLOCK的作用是允許用戶先讀取數(shù)據(jù)(而且不阻塞其他用戶讀數(shù)據(jù)),并且保證在后來(lái)再更新數(shù)據(jù)時(shí),這一段時(shí)間內(nèi)這些數(shù)據(jù)沒(méi)有被其他用戶修改。
死鎖問(wèn)題
在數(shù)據(jù)庫(kù)系統(tǒng)中,死鎖是指多個(gè)用戶(進(jìn)程)分別鎖定了一個(gè)資源,并又試圖請(qǐng)求鎖定對(duì)方已經(jīng)鎖定的資源,這就產(chǎn)生了一個(gè)鎖定請(qǐng)求環(huán),導(dǎo)致多個(gè)用戶(進(jìn)程)都處于等待對(duì)方釋放所鎖定資源的狀態(tài)。這種死鎖是最典型的死鎖形式, 例如在同一時(shí)間內(nèi)有兩個(gè)事務(wù)A和B,事務(wù)A有兩個(gè)操作:鎖定表part和請(qǐng)求訪問(wèn)表supplier;事務(wù)B也有兩個(gè)操作:鎖定表supplier和請(qǐng)求訪問(wèn)表part。結(jié)果,事務(wù)A和事務(wù)B之間發(fā)生了死鎖。
死鎖的第二種情況是,當(dāng)在一個(gè)數(shù)據(jù)庫(kù)中時(shí),有若干個(gè)長(zhǎng)時(shí)間運(yùn)行的事務(wù)執(zhí)行并行的操作,當(dāng)查詢分析器處理一種非常復(fù)雜的查詢例如連接查詢時(shí),那么由于不能控制處理的順序,有可能發(fā)生死鎖現(xiàn)象。
在SQL Server中,系統(tǒng)能夠自動(dòng)定期搜索和處理死鎖問(wèn)題。系統(tǒng)在每次搜索中標(biāo)識(shí)所有等待鎖定請(qǐng)求的進(jìn)程會(huì)話,如果在下一次搜索中該被標(biāo)識(shí)的進(jìn)程仍處于等待狀態(tài),SQL Server就開始遞歸死鎖搜索。當(dāng)搜索檢測(cè)到鎖定請(qǐng)求環(huán)時(shí),SQL Server 通過(guò)自動(dòng)選擇可以打破死鎖的線程(死鎖犧牲品)來(lái)結(jié)束死鎖。SQL Server 回滾作為死鎖犧牲品的事務(wù),通知線程的應(yīng)用程序(通過(guò)返回 1205 號(hào)錯(cuò)誤信息),取消線程的當(dāng)前請(qǐng)求,然后允許不間斷線程的事務(wù)繼續(xù)進(jìn)行。SQL Server 通常選擇運(yùn)行撤消時(shí)花費(fèi)最少的事務(wù)的線程作為死鎖犧牲品。另外,用戶可以使用 SET 語(yǔ)句將會(huì)話的 DEADLOCK_PRIORITY 設(shè)置為 LOW。DEADLOCK_PRIORITY 選項(xiàng)控制在死鎖情況下如何衡量會(huì)話的重要性。如果會(huì)話的設(shè)置為 LOW ,則當(dāng)會(huì)話陷入死鎖情況時(shí)將成為首選犧牲品。
理解了死鎖的概念,在應(yīng)用程序中就可以采用下面的一些方法來(lái)盡量避免死鎖了: (1)合理安排表訪問(wèn)順序。 (2)在事務(wù)中盡量避免用戶干預(yù),盡量使一個(gè)事務(wù)處理的任務(wù)少些, 保持事務(wù)簡(jiǎn)短并在一個(gè)批處理中。 (3)數(shù)據(jù)訪問(wèn)時(shí)域離散法, 數(shù)據(jù)訪問(wèn)時(shí)域離散法是指在客戶機(jī)/服務(wù)器結(jié)構(gòu)中,采取各種控制手段控制對(duì)數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)中的對(duì)象訪問(wèn)時(shí)間段。主要通過(guò)以下方式實(shí)現(xiàn): 合理安排后臺(tái)事務(wù)的執(zhí)行時(shí)間,采用工作流對(duì)后臺(tái)事務(wù)進(jìn)行統(tǒng)一管理。工作流在管理任務(wù)時(shí),一方面限制同一類任務(wù)的線程數(shù)(往往限制為1個(gè)),防止資源過(guò)多占用; 另一方面合理安排不同任務(wù)執(zhí)行時(shí)序、時(shí)間,盡量避免多個(gè)后臺(tái)任務(wù)同時(shí)執(zhí)行,另外, 避免在前臺(tái)交易高峰時(shí)間運(yùn)行后臺(tái)任務(wù)。 (4)數(shù)據(jù)存儲(chǔ)空間離散法。數(shù)據(jù)存儲(chǔ)空間離散法是指采取各種手段,將邏輯上在一個(gè)表中的數(shù)據(jù)分散到若干離散的空間上去,以便改善對(duì)表的訪問(wèn)性能。主要通過(guò)以下方法實(shí)現(xiàn): 第一,將大表按行或列分解為若干小表; 第二,按不同的用戶群分解。 (5)使用盡可能低的隔離性級(jí)別。隔離性級(jí)別是指為保證數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性和一致性而使多用戶事務(wù)隔離的程度,SQL92定義了4種隔離性級(jí)別:未提交讀、提交讀、可重復(fù)讀和可串行。如果選擇過(guò)高的隔離性級(jí)別,如可串行,雖然系統(tǒng)可以因?qū)崿F(xiàn)更好隔離性而更大程度上保證數(shù)據(jù)的完整性和一致性,但各事務(wù)間沖突而死鎖的機(jī)會(huì)大大增加,大大影響了系統(tǒng)性能。 (6)使用綁定連接, 綁定連接允許兩個(gè)或多個(gè)事務(wù)連接共享事務(wù)和鎖,而且任何一個(gè)事務(wù)連接要申請(qǐng)鎖如同另外一個(gè)事務(wù)要申請(qǐng)鎖一樣,因此可以允許這些事務(wù)共享數(shù)據(jù)而不會(huì)有加鎖的沖突。
總之,了解SQL Server的鎖機(jī)制,掌握數(shù)據(jù)庫(kù)鎖定方法, 對(duì)一個(gè)合格的DBA來(lái)說(shuō)是很重要的。
以上就是關(guān)于未提交讀相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
快手未提現(xiàn)的錢去哪了(快手未提現(xiàn)錢都沒(méi)有了)
視頻號(hào)怎么找回來(lái)(我的視頻號(hào)怎么找回來(lái))
南寧網(wǎng)絡(luò)公司必薦云尚網(wǎng)絡(luò)(南寧云尚網(wǎng)絡(luò)科技有限公司)
猜你喜歡
零基礎(chǔ)怎么當(dāng)程序員(程序員自學(xué))
如何優(yōu)化工作流程的行動(dòng)計(jì)劃(如何優(yōu)化工作流程的行動(dòng)計(jì)劃和措施)
無(wú)錫火車站紅帽子服務(wù)(無(wú)錫火車站紅帽子服務(wù)中心)
重慶百度競(jìng)價(jià)開戶(重慶百度競(jìng)價(jià)開戶哪家不錯(cuò))
地理信息科學(xué)是坑(地理信息科學(xué)出來(lái)干嘛)
手機(jī)上免費(fèi)修改pdf的軟件(手機(jī)上免費(fèi)修改pdf的軟件叫什么)
網(wǎng)頁(yè)轉(zhuǎn)軟件生成器(網(wǎng)頁(yè)轉(zhuǎn)應(yīng)用一鍵生成器)