sqlupdate鎖
Ⅰ 為什麼我們需要在sql Server里更新鎖
首先介紹下當更新鎖(Update(U)Lock)獲得時,根據它的兼容性鎖本身是如何應對的。
一般來說,當執行UPDATE語句時,SQL Server會用到更新鎖(Update Lock)。如果查看對應的執行計劃,會看到它包含3個部分:
讀取數據
計算新值
寫入數據
這是其中一個主要原因,為什麼關系資料庫引擎引入更新鎖來實現避免特定的死鎖情形。一個更新鎖只與一個共享鎖兼容,但不與另一個更新或排它鎖兼容。因此死鎖情形可以被避免,應為2個更新查詢計劃不可能同時並發運行。在查詢的第1階段,第2個查詢會一直等到獲得更新鎖。System R的一個未公開研究也展示如何避免這類顯著的死鎖。System R不實用任何更新鎖來實現避免死鎖。
提升的並發
在第1階段不獲得更新鎖,在這個階段直接獲得排它鎖也是可見選項。這會克服死鎖問題,因為排它鎖與另一個排它鎖不兼容。但這個方法的問題是並發受限制,因為同時沒有其他的SELECT查詢可以讀取當前有排它鎖的數據。因此需要更新鎖,因為這個特定鎖與傳統的共享鎖兼容。這樣的話其他的SELECT查詢可以讀取數據,只要這個更新鎖還沒轉化為排它鎖。作為副作用,這會提高我們並發運行查詢的並發性。
在以前關系學術上,更新鎖是所謂的非對稱鎖(Asymmetric Lock)。在更新鎖的上下文里,這個更新鎖與共享鎖兼容,但反之就不是:共享鎖與更新鎖不兼容。但SQL Server並不把共享鎖作為非對稱鎖實現。更新鎖是個對稱(symmetric)的,就是說更新鎖和共享鎖是彼此雙向兼容的。這會提供系統的整體並發,因為在2個鎖類型鍵不會引入阻塞情形。
小結
在今天的文章里你介紹了共享鎖,還有為什麼需要共享鎖在關系資料庫,是強烈需要更新鎖的,因為不然的就會帶來死鎖並降低並發。
Ⅱ sql server里update時,是行鎖還是表鎖問題
我覺得是表鎖吧, 那個進程貌似是針對表的。 每次更新超大的表,就經常報錯。要是行鎖應該不會報錯的, 我更新的東西都是以前月份的記錄, 不是當前操作的, 我覺得是表鎖!
Ⅲ sql server里update時,是行鎖還是表鎖問題
當然會,select要獲得共享鎖,update要獲得排他鎖,排他鎖與其他鎖都沖突
可以用select * from tb(nolock) 指定查詢不佔用鎖資源,就不會沖突了
Ⅳ 在sql資料庫insert,update操作的數據量超過多少會死鎖
死鎖是操作系統的名詞。是指在響應資料庫操作時的反應情況。
這個與計算機的配置及環境設置有關。
注意一般的insert不會出問題,因為此語句,只是在資料庫的最末寫入新紀錄。
而update,較之占內存。
Ⅳ sql server update 怎麼取消表鎖
listViewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
Vector v = (Vector)inputElement;
return v.toArray();
}
Ⅵ mysql update會鎖表嗎
有一個任務序列控制sql語句的執行,
第一次有select的語句查詢表a,mysql伺服器在執行select之前將表a加讀鎖,
第二次又有一條select語句查詢表a, mysql伺服器發現在任務序列中有表a的讀鎖,也就是同時還有一個sql查詢表a,讀鎖不會影響這條sql語句,
當有一條update或者insert語句對表a操作時,mysql伺服器會對表a加寫鎖,以此提示之後的對表a操作的sql語句等待寫鎖解鎖後在執行,以免造成寫入與讀取的混亂
Ⅶ sql server里update時,是行鎖還是表鎖問題
鎖表。
若指定主鍵,只有一條記錄,則鎖行。
若不指定,則鎖表。
Ⅷ sql server里update時,是行鎖還是表鎖問題
看錶結構,如果沒有主鍵無法只鎖定行
如果要驗證的話,只需要類似下面的方法就行了:
--開事務,以保持鎖
BEGINTRAN
--更新
updatetablea
setcolumn1=1
whereidx=1
--列出鎖信息
EXECsp_lock@@spid
--提交或者回滾事務
COMMIT/ROLLBACKTRAN
輸出的結果大致是這樣:
通過dbid,ObjId可以找到你更新的表相關的鎖記錄
如果IndId為0,表示鎖在表上,否則在對應的索引上
通過Type列,可以確定被鎖定的是行/表,或者是其他,並且可以通過Mode看到是什麼鎖
在Status中,還可以看到鎖是已經加上了,還是在等待其他資源釋放(以取得加鎖的權利)
-------------------------------------------------------------------------
53111151510180TABISGRANT
鎖的類型(Tyep列值,RID和KEY的話,表示鎖在行上)有如下幾種:
RID=表中單個行的鎖,由行標識符(RID)標識。
KEY=索引內保護可串列事務中一系列鍵的鎖。
PAG=數據頁或索引頁的鎖。
EXT=對某區的鎖。
TAB=整個表(包括所有數據和索引)的鎖。
DB=資料庫的鎖。
FIL=資料庫文件的鎖。
APP=指定的應用程序資源的鎖。
MD=元數據或目錄信息的鎖。
HBT=堆或B樹索引的鎖。在SQLServer2005中此信息不完整。
AU=分配單元的鎖。在SQLServer2005中此信息不完整。
Ⅸ sql server update會死鎖嗎
會死鎖,當資源被別的幾個進程互相佔用的時候,就會死鎖,舉個簡單的列子
出現循環等待資源。
當sql發出一個update請求之後,資料庫會對表中的每條記錄加上U鎖。然後資料庫會根據where條件,將符合條件的記錄轉換為X鎖。對不滿足條件的記錄釋放U鎖。
上面死鎖的原因就是更新的時候先要查詢相關的記錄才能更新,這個時候就有可能會產生死鎖。當然還有很多其它的原因也有可能產生死鎖。