十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
當(dāng)多個(gè)用戶同時(shí)更新同一數(shù)據(jù)的時(shí)候,由于更新可能導(dǎo)致數(shù)據(jù)的不一致性,使得程序的業(yè)務(wù)數(shù)據(jù)發(fā)生錯(cuò)誤,這種情況可以稱之為并發(fā)。在ADO
雅安網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,雅安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為雅安1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的雅安做網(wǎng)站的公司定做!
.NET中,并發(fā)的處理可以通過三種方式來控制:保守式并發(fā)控制、開發(fā)式并發(fā)控制以及最后更新生效方式。
—
保守式并發(fā)控制:數(shù)據(jù)從數(shù)據(jù)庫(kù)取出之后,一直處于鎖定的狀態(tài),其他用戶不能獲取該數(shù)據(jù),直至數(shù)據(jù)更新完畢之后,用戶才能取出該數(shù)據(jù)進(jìn)行操作。此種控制方式對(duì)于性能和資源占用得很多,由于只能同時(shí)有一個(gè)用戶對(duì)數(shù)據(jù)享用操作權(quán),所以可能會(huì)在正常業(yè)務(wù)中,影響其他用戶的處理進(jìn)程。但此控制方式可以完全保證數(shù)據(jù)的完整性。該方式可以通過.NET提供的事務(wù)機(jī)制來實(shí)現(xiàn),前提是數(shù)據(jù)源需要支持事務(wù)。
—
開發(fā)式并發(fā)控制:數(shù)據(jù)在更新之前都是可以被其他用戶使用的,只有在更新的時(shí)候,才鎖定記錄。但更新的時(shí)候,會(huì)比對(duì)與查詢之初的數(shù)據(jù)是否吻合,如果不一致,則不運(yùn)行修改。此種控制方式也可以完全保證數(shù)據(jù)的完整性,其優(yōu)點(diǎn)是不會(huì)占用其他用戶訪問該數(shù)據(jù)的權(quán)限,其缺點(diǎn)是由于其他用戶可能已經(jīng)更新了這些數(shù)據(jù),導(dǎo)致本次更新可能不會(huì)完成。對(duì)于此種控制方式,多以開發(fā)人員通過程序本身的業(yè)務(wù)邏輯來實(shí)現(xiàn)。
—
最后更新生效方式:此種方式同上,只有在數(shù)據(jù)更新的時(shí)候,其他用戶才不可使用,但更新的時(shí)候不檢查是否與開始數(shù)據(jù)一致,而直接對(duì)其更新。此種方式對(duì)于更新的并發(fā)性有很大的支持,但缺點(diǎn)是可能引發(fā)前后數(shù)據(jù)的不一致。此種方式適合可以滿足此需求的業(yè)務(wù)場(chǎng)景使用。
注意:數(shù)據(jù)庫(kù)的并發(fā)處理并不是一成不變的,不同的業(yè)務(wù)場(chǎng)景對(duì)數(shù)據(jù)庫(kù)的并發(fā)要求是不一樣的,可以根據(jù)具體情況具體分析
SQL Server 2008支持并發(fā)的連接數(shù)分兩種情況:
1)不啟用連接池
當(dāng)創(chuàng)建到101個(gè)連接的時(shí)候,就無(wú)法再創(chuàng)建新連接了。也就是說,如果連接字符串不做任何處理,我們的程序只能夠跟SQLServer建立101個(gè)連接。
2)啟用連接池
在連接字符串中加入代碼:
Pooling=true;Max Pool Size=40000;Min Pool Size=0;
微軟在MSDN上對(duì)最大連接數(shù)的定義是:“默認(rèn)是0,代表不限制,但最大連接數(shù)是32767。
SQL Server支持同時(shí)訪問的客戶端數(shù)量:
開發(fā)版、速成版有客戶連接限制,一般是10個(gè)連接。企業(yè)版、標(biāo)準(zhǔn)版沒有限制,硬件能支持多少就能支持多少。
擴(kuò)展資料
sql server 2008 R2 連接數(shù)過高的解決辦法:
由于公司最近兩個(gè)Web站點(diǎn)做了負(fù)載均衡,但是緩存機(jī)制仍然是 Asp.Net 自帶的緩存,這樣就導(dǎo)致了每臺(tái)Web 服務(wù)器內(nèi)存中都有一份緩存,直接導(dǎo)致了多次請(qǐng)求DB數(shù)據(jù)庫(kù),造成了DB連接數(shù)過高。
由于是兩個(gè)較大的站點(diǎn)兩臺(tái)服務(wù)器做負(fù)載均衡(負(fù)載平衡),所以,DB 的連接數(shù)也飆升,幾乎翻了3倍。
公司DB服務(wù)器用的是 Sql Server 2008 R2 ,并且DB服務(wù)器配置是相當(dāng)?shù)膹?qiáng)悍的,連接數(shù)一度沖擊到740,真是讓人驚嘆不已。雖然鏈接數(shù)強(qiáng)悍,但是前臺(tái)訪問的頁(yè)面 超時(shí)的 也是茫茫多,沒辦法,只能采用了緊急處理:
1、加大程序中的緩存,特別是頁(yè)面頭部加上 OutPutCache 緩存。
2、用上鏡像的備份DB服務(wù)器,把2個(gè)站點(diǎn)的DB鏈接改到了鏡像的DB,這臺(tái)鏡像DB和現(xiàn)在主DB是不在同一個(gè)機(jī)房的,目標(biāo)就是容災(zāi)和在高流量的情況下快速切換
與服務(wù)器配置相關(guān),sql可以自行設(shè)置并發(fā)數(shù)與最大可用內(nèi)存,是否并發(fā)也還得看程序,不然sql并發(fā)再多,程序也得排隊(duì)交sql
凡是大型的系統(tǒng),必然要分庫(kù),也就是根據(jù)邏輯進(jìn)行數(shù)據(jù)拆分。比如用戶的數(shù)據(jù),你可以根據(jù)用戶所在的省份劃分,一個(gè)省份一個(gè)數(shù)據(jù)庫(kù),只有這樣才能真正的保證大數(shù)量的并發(fā)。
另外要有效的利用讀寫分離,讀寫分離用sql server 2012的話可以直接用always on,一個(gè)用來寫,若干用來讀。數(shù)據(jù)庫(kù)自身會(huì)保證數(shù)據(jù)的一致性的,這樣就不會(huì)出現(xiàn)查備份庫(kù)數(shù)據(jù)還沒同步過來的問題了。
sqlserver
本身通過不同等級(jí)的鎖處理并發(fā)控制。
有記錄鎖、頁(yè)鎖、表鎖。
如果多個(gè)用戶同時(shí)操作一個(gè)記錄,只有第一個(gè)能修改,后面的修改時(shí)處理等等狀態(tài)。
但是在一般程序界面上,多個(gè)人同時(shí)打開了同一個(gè)記錄要進(jìn)行修改,數(shù)據(jù)庫(kù)往往是保存最后一個(gè)修改的數(shù)據(jù)??梢栽诒4媲白鲵?yàn)證,如果發(fā)現(xiàn)打開的數(shù)據(jù)已改變(界面和數(shù)據(jù)庫(kù)一不致了),則提示數(shù)據(jù)已改變,重新獲取新數(shù)據(jù),然后才能修改和保存。