鎖是資料庫為了控制併發資料的完整性而引入的機制。鎖表只是鎖的一種。
鎖表簡單來說就是一個事務操作對錶A進行加鎖(排他鎖),但一直不釋放該鎖,A表處於鎖定狀態。其他事務無法會訪問該表造成鎖等待。
DB2鎖表
DB2支援的表級鎖定
1、IN 無意圖鎖(Intent Node),不需要行鎖,擁有者可以讀取包括其他事務未提交資料在內的所有資料,但不能對錶中的資料作出修改。
2、IS意圖共享鎖(Intent Share),需要行鎖配合擁有者可以在擁有相應行上的S鎖時可以讀取該行的資料,但不能修改資料。
3、IX意圖排他鎖(Intent eXclusive),需要行鎖配合擁有者可以在擁有相應行上的X鎖時可以修改該行的資料
4、SIX共享並且意圖排他鎖(Share with Intent eXclusive),需要行鎖配合擁有者可以讀取表中的任何資料,如果在相應的行上可以獲得X鎖,可以修改該行。SIX的獲取比較特殊,當程式擁有IX鎖時請求S鎖,或者在已經擁有S鎖的時候請求IX鎖時產生
5、S共享鎖(Share),不需要行鎖配合可以讀取表上的任何資料,如果表上被加了S鎖,表上的資料只能被讀取而不能做出任何修改
6、U 更新鎖(Update),不需要行鎖配合擁有者可以讀取表中的任何資料,如果升級為X鎖,則可以更改表中的任何資料,該鎖是等待對資料進行修改的一種中間狀態
7、X排他鎖(eXclusive),不需要行鎖配合擁有者可以讀取或者修改表中的任意資料,如果加上了X鎖,除了未提交讀事務外,其他程式都不能對錶進行任何讀取或者修改
具體來說,IS,IX,SIX用於表一級並且需要行鎖配合,用於阻止其他程式對錶加上排他鎖。區別如下:
· 如果一個程式獲得表的IS鎖,程式可以獲得某一行上的S鎖用於只讀操作,其他程式也可以讀取該行,或者對錶中其他行作出修改。
· 如果一個程式獲得表的IX鎖,程式可以獲得某一行的X鎖用於更改操作,其他程式可以更改或者讀取表中其他的行。
· 如果一個程式獲得表的SIX鎖,程式可以獲得某一行的X鎖用於更改操作,其他程式只能對錶中的其他行進行只讀操作。
S,U,X,Z用於表一級,不需要行鎖的配合。區別如下:
· 如果程式得到表的S鎖,則程式可以讀表中的任意資料,同時允許其他程式獲得表上的只讀鎖請求,如果有程式需要更改表上的資料,必須等到S鎖釋放。
· 如果程式得到U鎖,程式可以讀取表中任意資料,最終可以透過獲得X鎖得到對錶中任意資料的修改權,其他程式只能讀取表中的資料,U鎖與S鎖的區別在於修改意圖,U鎖的設計主要是為了避免兩個程式在擁有S鎖的情況下同時申請X鎖導致死鎖。
· 如果程式得到表上的X鎖,程式可以讀或者修改表上任意資料,其他程式無法讀或者修改表上的資料。
· 如果程式獲得Z鎖,程式可以讀或者修改表中任意資料,其他程式包括未提交讀程式在內不能對錶執行讀或者修改操作。
IN鎖用於表上以允許未提交讀這一概念。
預設情況下,DB2總是嘗試獲取行鎖,但可以使用ALTER TABLE語句修改為總是獲取表鎖,也可以使用LOCK TABLE語句獲取表鎖。
鎖是資料庫為了控制併發資料的完整性而引入的機制。鎖表只是鎖的一種。
鎖表簡單來說就是一個事務操作對錶A進行加鎖(排他鎖),但一直不釋放該鎖,A表處於鎖定狀態。其他事務無法會訪問該表造成鎖等待。
DB2鎖表
DB2支援的表級鎖定
1、IN 無意圖鎖(Intent Node),不需要行鎖,擁有者可以讀取包括其他事務未提交資料在內的所有資料,但不能對錶中的資料作出修改。
2、IS意圖共享鎖(Intent Share),需要行鎖配合擁有者可以在擁有相應行上的S鎖時可以讀取該行的資料,但不能修改資料。
3、IX意圖排他鎖(Intent eXclusive),需要行鎖配合擁有者可以在擁有相應行上的X鎖時可以修改該行的資料
4、SIX共享並且意圖排他鎖(Share with Intent eXclusive),需要行鎖配合擁有者可以讀取表中的任何資料,如果在相應的行上可以獲得X鎖,可以修改該行。SIX的獲取比較特殊,當程式擁有IX鎖時請求S鎖,或者在已經擁有S鎖的時候請求IX鎖時產生
5、S共享鎖(Share),不需要行鎖配合可以讀取表上的任何資料,如果表上被加了S鎖,表上的資料只能被讀取而不能做出任何修改
6、U 更新鎖(Update),不需要行鎖配合擁有者可以讀取表中的任何資料,如果升級為X鎖,則可以更改表中的任何資料,該鎖是等待對資料進行修改的一種中間狀態
7、X排他鎖(eXclusive),不需要行鎖配合擁有者可以讀取或者修改表中的任意資料,如果加上了X鎖,除了未提交讀事務外,其他程式都不能對錶進行任何讀取或者修改
具體來說,IS,IX,SIX用於表一級並且需要行鎖配合,用於阻止其他程式對錶加上排他鎖。區別如下:
· 如果一個程式獲得表的IS鎖,程式可以獲得某一行上的S鎖用於只讀操作,其他程式也可以讀取該行,或者對錶中其他行作出修改。
· 如果一個程式獲得表的IX鎖,程式可以獲得某一行的X鎖用於更改操作,其他程式可以更改或者讀取表中其他的行。
· 如果一個程式獲得表的SIX鎖,程式可以獲得某一行的X鎖用於更改操作,其他程式只能對錶中的其他行進行只讀操作。
S,U,X,Z用於表一級,不需要行鎖的配合。區別如下:
· 如果程式得到表的S鎖,則程式可以讀表中的任意資料,同時允許其他程式獲得表上的只讀鎖請求,如果有程式需要更改表上的資料,必須等到S鎖釋放。
· 如果程式得到U鎖,程式可以讀取表中任意資料,最終可以透過獲得X鎖得到對錶中任意資料的修改權,其他程式只能讀取表中的資料,U鎖與S鎖的區別在於修改意圖,U鎖的設計主要是為了避免兩個程式在擁有S鎖的情況下同時申請X鎖導致死鎖。
· 如果程式得到表上的X鎖,程式可以讀或者修改表上任意資料,其他程式無法讀或者修改表上的資料。
· 如果程式獲得Z鎖,程式可以讀或者修改表中任意資料,其他程式包括未提交讀程式在內不能對錶執行讀或者修改操作。
IN鎖用於表上以允許未提交讀這一概念。
預設情況下,DB2總是嘗試獲取行鎖,但可以使用ALTER TABLE語句修改為總是獲取表鎖,也可以使用LOCK TABLE語句獲取表鎖。