鎖(Lock):當系統中有用戶並發操作時,用於保護數據一致性的機制。可以保證不同用戶訪問到的是正確的信息。
1.TD四種類型的鎖
(1)EXCLUSIVE
排它鎖,級別最高。持有此鎖時,其它任何新申請鎖均需等待。一般是DDL操作,如create、drop、alter數據庫/表/視圖等。
(2)WRITE
寫鎖,級別第二。持有此鎖時,新申請的READ、WRITE、EXCLUSIVE鎖需等待,僅ACCESS鎖無需等待。一般是DML操作中的insert、update和delete。
(3)READ
讀鎖,級別第三。持有此鎖時,新申請的WRITE、EXCLUSIVE鎖需等待,ACCESS、READ鎖無需等待。一般是DML操作中的select。
(4)ACCESS
訪問鎖,級別最低。持有此鎖時,僅新申請的EXCLUSIVE鎖需等待。
2.TD鎖的作用域
(1)Row Hash
記錄級,只鎖定具備相同Row Hash值的記錄。在SQL語句中提供了主索引或者唯一次索引時使用,因為可以根據索引值可計算出 ROW HASH 值。
(2)Table/View
表級,鎖定全表或全視圖所有數據。
(3)Partition
分區級,鎖定指定分區所有數據。數據庫版本15.10引入。
(4)Database
數據庫級,鎖定數據庫所有表和視圖。
3.改變鎖的類型
可以通過下面命令降低或者提高鎖等級,所有等級的鎖均可以提高,但降低鎖等級只可以把Read降為Access,其它等級不能降低。
LOCKING ROW FOR ACCESS SELECT * FROM Table_A; //由Read鎖降為Access鎖 LOCKING TABLE Table_B FOR EXCLUSIVE UPDATE Table_B SET A = 2007; //由Write鎖升為Exclusive鎖 LOCKING TABLE Table_C FOR WRITE NOWAIT UPDATE Table_C SET A = 2008; //NOWAIT選項表示如果無法獲取鎖,則語句將被中止,並報7423錯誤。
總之:針對 update ,insert ,delete等SQL語句一定要及進commit。針對表的查詢盡量用視圖屏蔽其鎖機制。