db2什么情況會鎖表?
鎖是數據庫為了控制并發數據的完整性而引入的機制。鎖表只是鎖的一種。鎖表簡單來說就是一個事務操作對表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鎖,除了未提交讀事務外,其他程序都不能對表進行任何讀取或者修改8、Z超級排他鎖(Super eXclusive),不需要行鎖配合該鎖一般不是由DML產生,而是由Drop,Alter或者創建刪除索引時產生的,加上Z鎖后,所有程序(包括未提交讀程序)都不能對表進行讀取或者修改具體來說,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語句獲取表鎖。