A. .net里操作資料庫時怎樣防止並發啊
鎖表是最簡單的
自己操作是,上鎖,操作完之後解鎖
參考
==============================
鎖定資料庫的一個表
SELECT * FROM table WITH (HOLDLOCK)
注意: 鎖定資料庫的一個表的區別
SELECT * FROM table WITH (HOLDLOCK)
其他事務可以讀取表,但不能更新刪除
SELECT * FROM table WITH (TABLOCKX)
其他事務不能讀取表,更新和刪除
SELECT 語句中「加鎖選項」的功能說明
sql Server提供了強大而完備的鎖機制來幫助實現資料庫系統的並發性和高性能。用戶既能使用SQL Server的預設設置也可以在select 語句中使用「加鎖選項」來實現預期的效果。 本文介紹了SELECT語句中的各項「加鎖選項」以及相應的功能說明。
功能說明:
NOLOCK(不加鎖)
此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的「臟數據」。
HOLDLOCK(保持鎖)
此選項被選中時,SQL Server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。
UPDLOCK(修改鎖)
此選項被選中時,SQL Server 在讀取數據時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個進程能同時讀取數據但只有該進程能修改數據。
TABLOCK(表鎖)
此選項被選中時,SQL Server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他進程只能讀取而不能修改數據。
PAGLOCK(頁鎖)
此選項為默認選項, 當被選中時,SQL Server 使用共享頁鎖。
TABLOCKX(排它表鎖)
此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的數據。
HOLDLOCK 持有共享鎖,直到整個事務完成,應該在被鎖對象不需要時立即釋放,等於SERIALIZABLE事務隔離級別
NOLOCK 語句執行時不發出共享鎖,允許臟讀 ,等於 READ UNCOMMITTED事務隔離級別
PAGLOCK 在使用一個表鎖的地方用多個頁鎖
READPAST 讓sql server跳過任何鎖定行,執行事務,適用於READ UNCOMMITTED事務隔離級別只跳過RID鎖,不跳過頁,區域和表鎖
ROWLOCK 強制使用行鎖
TABLOCKX 強制使用獨占表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表
UPLOCK 強制在讀表時使用更新而不用共享鎖
注意: 鎖定資料庫的一個表的區別
SELECT * FROM table WITH (HOLDLOCK) 其他事務/語句可以讀取表,但不能更新刪除
SELECT * FROM table WITH (TABLOCKX) 其他事務/語句不能讀取表,更新和刪除
例子:
begin tran
select * from test_table with (TABLOCKX) //表鎖
commit tran
這時,其它語句,比如select * from test_table將只能等待
B. 如何才能防止並發運行
鎖述的概
一. 為什麼要引入鎖
多個用戶同時對資料庫的並發操作時會帶來以下數據不一致的問題:
丟失更新
A,B兩個用戶讀同一數據並進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統
臟讀
A用戶修改了數據,隨後B用戶又讀出該數據,但A用戶因為某些原因取消了對數據的修改,數據恢復原值,此時B得到的數據就與資料庫內的數據產生了不一致
不可重復讀
A用戶讀取數據,隨後B用戶讀出該數據並修改,此時A用戶再讀取數據時發現前後兩次的值不一致
並發控制的主要方法是封鎖,鎖就是在一段時間內禁止用戶做某些操作以避免產生數據不一致
二 鎖的分類
鎖的類別有兩種分法:
1. 從資料庫系統的角度來看:分為獨占鎖(即排它鎖),共享鎖和更新鎖
MS-SQL Server 使用以下資源鎖模式。
鎖模式 描述
共享 (S) 用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句。
更新 (U) 用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
排它 (X) 用於數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。
意向鎖 用於建立鎖的層次結構。意向鎖的類型為:意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。
架構鎖 在執行依賴於表架構的操作時使用。架構鎖的類型為:架構修改 (Sch-M) 和架構穩定性 (Sch-S)。
大容量更新 (BU) 向表中大容量復制數據並指定了 TABLOCK 提示時使用。
C. 如何處理大量數據並發操作
處理大量數據並發操作可以採用如下幾種方法:
1.使用緩存:使用程序直接保存到內存中。或者使用緩存框架: 用一個特定的類型值來保存,以區別空數據和未緩存的兩種狀態。
2.資料庫優化:表結構優化;SQL語句優化,語法優化和處理邏輯優化;分區;分表;索引優化;使用存儲過程代替直接操作。
3.分離活躍數據:可以分為活躍用戶和不活躍用戶。
4.批量讀取和延遲修改: 高並發情況可以將多個查詢請求合並到一個。高並發且頻繁修改的可以暫存緩存中。
5.讀寫分離: 資料庫伺服器配置多個,配置主從資料庫。寫用主資料庫,讀用從資料庫。
6.分布式資料庫: 將不同的表存放到不同的資料庫中,然後再放到不同的伺服器中。
7.NoSql和Hadoop: NoSql,not only SQL。沒有關系型資料庫那麼多限制,比較靈活高效。Hadoop,將一個表中的數據分層多塊,保存到多個節點(分布式)。每一塊數據都有多個節點保存(集群)。集群可以並行處理相同的數據,還可以保證數據的完整性。
拓展資料:
大數據(big data),指無法在一定時間范圍內用常規軟體工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。
在維克托·邁爾-舍恩伯格及肯尼斯·庫克耶編寫的《大數據時代》中大數據指不用隨機分析法(抽樣調查)這樣捷徑,而採用所有數據進行分析處理。大數據的5V特點(IBM提出):Volume(大量)、Velocity(高速)、Variety(多樣)、Value(低價值密度)、Veracity(真實性)。
D. ASP.NET 怎麼防止並發操作
1、資料庫有主鍵。插入數據不會出現你說的什麼錯誤或不穩定吧
2、調用sql對資料庫修改本身是自動上鎖的。
如果要保證程序邏輯的一致性需要使用事務。
3、比如主鍵遞增這種情況,或者只要是有主鍵。
4、程序無論用什麼方式,都不可能在資料庫中插入兩條主鍵相同的記錄。
5、同時多人使用,是否包括一種情況:同時多人修改(包括刪除)。如果僅僅是同時多人添加,那麼毫無問題。不會有並發問題;
6、如果存在同時多人修改的可能性的話,那就需要用「開放式並發」或「非開放式並發」。
7、開放式並發」相對簡單。即:一個人修改並提交,被告知原始數據已被修改,則報錯;自己找找這方面資料吧,VS與.NET已經集成了一些簡單實現的方法。
E. 如何使用封鎖來進行並發事務的調度
DBMS 在對數據進行讀、寫操作之前首先對該數據執行封鎖操作,例如事務 T; 在對 A 進行修改之前先對 A 執行 Xlock(A) ,即對 A 加 X 鎖。這樣,當 T2 請求對 A 加 X 鎖時就被拒絕,T2 只能等待 T1 釋放 A 上的鎖後才能獲得對 A 的 X 鎖,這時它讀到的 A 是 T1 更新後的值,再按此新的 A 值進行運算。這樣就不會丟失 T1 的更新。 T1 ①Xlock A ②讀 A=16 ③A←A-1 寫回 A=15 Commit Unlock A ④ Xlock A 等待 等待 等待 等待 獲得 Xlock A 讀 A=15 A←A-1 寫回 A=14 Commit Unlock A T2 ⑤ DBMS 按照一定的封鎖協議,對並發操作進行控制,使得多個並發操作有序地執行, 就可以避免丟失修改、不可重復讀和讀「臟」數據等數據不一致性。
F. 數據並發控制的意義有哪些,可以避免那些現象
並發控制保證事務4個特性,acid:A:原子性(Atomicity) 事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。C:一致性(Consistency) 事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。I:隔離性 (Isolation) 一個事務的執行不能被其他事務干擾。 D:持續性/永久性(Durability) 一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。
G. 為什麼資料庫系統要採用並發控制
並發(concurrent)和並行(parallel)這兩個概念,在資料庫系統的資料中經常出現,然而有關它們的定義和區別卻沒有明確的說法。這里,我們根據這兩個概念在資料中的使用,對它們的不同做一個說明。
並發是指多個任務的同時執行,任務與任務之間沒有聯系。由於資料庫系統要同時為許多用戶提供服務,每個用戶都可以發出自己的訪問請求,一個請求就是一個任務。在一個時間點,資料庫系統可能要同時處理多個任務。因此,資料庫系統一定要具備並發處理能力。
並行是指將一個任務劃分為多個子任務,這些子任務同時執行。在所有子任務處理完成後,將它們的結果進行合並,就得到該任務的最終處理結果。在資料庫系統中,如果要執行一個大的數據查詢,為了提高速度、降低響應時間,用戶可以通過系統配置或者在命令中,要求對該大數據量查詢進行並行處理,將該查詢劃分成多個子查詢。這些子查詢同時執行,最後系統將所有子查詢的處理結果進行合並,作為該查詢處理的最終結果。現有的大型資料庫系統都支持並行處理。
需要說明的是,並發和並行與資料庫系統採用多進程還是多線程體系結構無關。對採用多進程結構的資料庫系統,所有的任務、子任務通過進程來處理;而對採用多線程結構的資料庫系統,這些工作是由線程來完成。
資料庫系統的並發控制,涉及到任務的調度、數據的一致性及可靠性等,而資料庫系統的並行處理,主要涉及任務的處理速度、系統性能等方面。
H. linux編程中如何防止多線程並發訪問鏈表問題
大多數系統中,需要運行的進程數是可以多於運行它們的CPU個數的。CPU並發的處理各個線程的時候,是通過處理器在各個線程直接相互切換來實現的。 就是宏觀上看的話進程A B是可以同時運行的,微觀上是CPU在線程A B中間不停的切換。你的那個情況可以這樣理解 進程A訪問數據D了,這時候進程A掛起,進程B運行,進程B也去訪問數據D,這就構成了同時訪問數據D了。其實只讀的話是可以同時訪問的,讀寫就很復雜了。
I. 資料庫的並發操作可能帶來哪些問題 丟失更新 死鎖 違反唯一性約束
資料庫中常見的並發操作所帶來的一致性問題包括:丟失的修改、不可重復讀、讀臟數據、幻影讀(幻影讀在一些資料中往往與不可重復讀歸為一類)。
丟失修改
下面先來看一個例子,說明並發操作帶來的數據的不一致性問題。
考慮飛機訂票系統中的一個活動序列:
甲售票點(甲事務)讀出某航班的機票余額A,設A=16.
乙售票點(乙事務)讀出同一航班的機票余額A,也為16.
甲售票點賣出一張機票,修改余額A←A-1.所以A為15,把A寫回資料庫.
乙售票點也賣出一張機票,修改余額A←A-1.所以A為15,把A寫回資料庫.
結果明明賣出兩張機票,資料庫中機票余額只減少1。
歸納起來就是:兩個事務T1和T2讀入同一數據並修改,T2提交的結果破壞了T1提交的結果,導致T1的修改被丟失。前文(2.1.4數據刪除與更新)中提到的問題及解決辦法往往是針對此類並發問題的。但仍然有幾類問題通過上面的方法解決不了,那就是:
不可重復讀
不可重復讀是指事務T1讀取數據後,事務T2執行更新操作,使T1無法再現前一次讀取結果。具體地講,不可重復讀包括三種情況:
事務T1讀取某一數據後,事務T2對其做了修改,當事務1再次讀該數據時,得到與前一次不同的值。例如,T1讀取B=100進行運算,T2讀取同一數據B,對其進行修改後將B=200寫回資料庫。T1為了對讀取值校對重讀B,B已為200,與第一次讀取值不一致。
事務T1按一定條件從資料庫中讀取了某些數據記錄後,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄神密地消失了。
事務T1按一定條件從資料庫中讀取某些數據記錄後,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄。(這也叫做幻影讀)
讀"臟"數據
讀"臟"數據是指事務T1修改某一數據,並將其寫回磁碟,事務T2讀取同一數據後,T1由於某種原因被撤消,這時T1已修改過的數據恢復原值,T2讀到的數據就與資料庫中的數據不一致,則T2讀到的數據就為"臟"數據,即不正確的數據。
產生上述三類數據不一致性的主要原因是並發操作破壞了事務的隔離性。並發控制就是要用正確的方式調度並發操作,使一個用戶事務的執行不受其它事務的干擾,從而避免造成數據的不一致性。
並發一致性問題的解決辦法
封鎖(Locking)
封鎖是實現並發控制的一個非常重要的技術。所謂封鎖就是事務T在對某個數據對象例如表