最近接獲支付功能的維運工作預告,原系統的維運負責小組給了我含有WITH(NOLOCK)的sql語法,故此開始研究Lock系列文章(順便複習語法😂)。
為什麼要Lock?
多筆交易(transaction)在資料存取時會產生併發影響(concurrency effects),為了保持交易的ACID,資料的讀取或是寫入時就會做一個記號,這個記號用來告知該資料正在被讀取或寫入的狀態,其他交易則根據這個記號來判斷是否要等待此交易結束亦或是可以直接讀取該資料。而這個記號就是所謂的 Lock。
--ACID:Atomicity (完整性、不可部份完成性)、Consistency (一致性)、Isolation (隔離性、獨立性)、Durability (耐久性)
Lock Modes
主要分為三個模式:共享式鎖定(S)、更新鎖定(U)、獨佔式鎖定(X)。
Shared Lock(S)
用於讀取資料的操作,例如:SELECT。讀取完畢就會立刻release,不需要等到交易整個完成,鎖定期間其他交易無法修改資料。
Update Lock(U)
用於資料的更新(寫入),如:UPDATE。因為要寫入了,所以不允許同時兩個交易同時進行,意即只有一個交易可以對該資料進行U Lock,(但可以做S Lock讀取的動作)。
Exclusive Lock(X)
用於INSERT、UPDATE、DELETE等寫入操作。
INSERT、DELETE會在交易的一開始就進行X Lock;
UPDATE則是先做U Lock之後再轉成X Lock。
原來下INSERT、DELETE、UPDATE等這類DML指令(DML, Data Manipulation Language)時,系統會伴隨S Lock讀取資料。而當X Lock產生時,其他交易即無法針對同一筆資料進行鎖定。意即X Lock無法與其他Lock相容,以確保其他交易不能讀取、寫入正在修改的資料。
(未完待續...)
沒有留言:
張貼留言