SQL Server中DML語句要申請的鎖

2021-09-08 17:23:31 字數 1720 閱讀 6556

對於select語句:

1、當採用表掃瞄時,會直接鎖定page,而不是鎖定詳細的某條記錄,所以會有這些鎖:

a、資料庫s鎖

b、表的is鎖

c、頁的s鎖

2、當採用索引來查詢資料時,會鎖定詳細的記錄,所以會有這些鎖:

a、資料庫s鎖

b、索引中page的

is鎖

c、索引中page中的key的s鎖

d、表的is鎖

e、頁的is鎖

f、rid的s鎖

3、對於讀過的頁面,會加乙個is鎖。

對於使用的索引,會對key加上s鎖,對索引key所在的頁面會加上is鎖。

在查詢過程中,會對每一條讀到的記錄或key加上s鎖。

假設記錄不是我們要查詢的,那麼就會釋放s鎖,假設記錄要返回,依據隔離級別,假設是read committed,那麼會釋放,否則就不會釋放。

對於update語句:

1、當採用表掃瞄時,會直接鎖定page,而不是鎖定詳細的某條記錄,所以會有這些鎖:

a、資料庫s鎖

b、表的ix鎖

2、當採用索引來查詢資料時,會索引詳細的記錄,所以會有這些鎖:

a、資料庫s鎖

b、索引中page的

iu鎖

c、索引中page中的key的u鎖,也就是不希望別的會話來改動這條記錄的key欄位,比方如今有2個會話,1個要改動第10條記錄的name欄位,還有乙個是要改動第10條記錄的key欄位,顯然,在乙個會話改動同一條記錄的name欄位時,肯定會堵塞住還有乙個會話改動key欄位。也就是說,對同一條記錄的不同字段,肯定是不能同一時候改動的,總是有個先後,否則資料就不一致了。

d、表的ix鎖

e、頁的iu鎖 或者是ix鎖,這個差別和上面是一樣的,查詢時用的是iu鎖,當發現這個頁內部有須要改動的記錄時,會轉化為ix鎖。

f、rid的x鎖

3、對每個使用的索引,會對key加上u鎖,對索引key所在的頁面會加上iu鎖。

因為update也須要先找到記錄,然後才幹更新,所以,在掃瞄過程中,對要掃瞄的記錄所在的頁,加上iu鎖,對頁中的記錄加上u鎖,假設這些記錄要改動,那麼會公升級為x鎖,頁面會公升級為ix鎖。假設這個記錄不須要更新,那麼會釋放u鎖,假設整個頁面都沒有要改動的記錄,那麼也會釋放iu鎖。

另外,使用到要改動列的索引越多,那麼鎖也會越多。比方如今要改動name欄位的值,而包括name欄位的索引有2個,那麼在改動name時,也須要鎖定這2個索引的頁面和key,所以會先改動表中name欄位的值,然後再改動涉及到name欄位的2個索引的key值,這個改動操作是先刪除,然後再插入key值,比方,要update 3條記錄,那麼最後改動索引時,會申請6個key 的x鎖,3個是要刪除的,3個是要插入的。

只是須要特別注意的是,update語句和select 語句的差別在於,update語句獲取的鎖,直到事務結束,才會釋放。

對於insert 語句:

a、資料庫s鎖

b、表的ix鎖

c、頁的ix鎖,對於要新插入資料的頁,也會有乙個ix鎖。

d、rid,對要新插入的資料,會申請乙個x鎖。

e、假設表中有多個索引,那麼每乙個索引上都要插入一條新的資料,要插入資料所在頁上,會有乙個ix鎖。

f、要插入索引中的key,也會有乙個x鎖。

注意:is、iu(臨時沒發如今表級別上有這個鎖)、ix這3個意向鎖,都是在表級別、頁級別的,而s、u(

臨時沒沒發如今表級別有這個鎖)、x 能夠在多個級別上。

mysql中的DML語句

dml 資料操作語言,對 中的資料進行操作,insert update delete。insert 插入 insert into 表名 欄位1,欄位2,欄位3,values 值1,值2,值3,語法1 欄位名稱全寫 insert into employee 欄位1,欄位2,values 值1,值2,例...

MySQL中的DML語句

插入資料 建立學生表 create table student sid int sname varchar 20 age int char 1 address varchar 40 向學生表中插入資料 方式1 插入全部字段 將所有欄位名都寫出來 insert into student sid,sna...

mysql中的DML語句

insert 的作用是向表中新增一行或多行資訊,語法為 insert into 表名 列名1 列名2.values 值1,值2.值1,值2.上面語法中,值與列要一一對應,對於表中字段有非空的約束,新增行時一定要對該字段賦值。values 關鍵字後面可以新增多個行的資訊,中間用 逗號 分開。表名後面的...