資料庫工程師下午試題5 :事務與鎖
阿新 • • 發佈:2020-11-01
共享鎖(Share Lock)
共享鎖又稱讀鎖,是讀取操作建立的鎖。其他使用者可以併發讀取資料,但任何事務都不能對資料進行修改(獲取資料上的排他鎖),直到已釋放所有共享鎖。
如果事務T對資料A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀資料,不能修改資料。
排他鎖(eXclusive Lock)
排他鎖又稱寫鎖,如果事務T對資料A加上排他鎖後,則其他事務不能再對A加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。
-------------------------------------------------
併發操作會導致什麼?
併發操作可能會導致丟失修改問題,一操作被另外一操作所覆蓋,原因是併發操作破壞了事務的隔離性。
這個時候需要引用兩段鎖協議,避免產生資料不一致的問題。
2個客人同時預訂一間客房,會出現什麼情況?
出現一個客人訂不到,或者兩個客人都訂到,這是併發衝突問題
若封裝為一個完整的事務,會出現什麼問題?分析產生效率問題的原因
如果中間存在和使用者的互動,則會造成長事務,例如在查詢剩餘票數後,會等待使用者的響應,導致其他使用者只能等待該使用者購票結束後才可購票,降低了系統的併發度;原因是事務劃分不合理。
解決方法是將查詢剩餘票數的指令置於事務外部,事務只負責使用者購票(互動之前放在事務外部)
//儲存過程 create procedure buy_tick(char(8) fightno in, int a in, int result in) as begin ................ update tickets set balance = balance -a where fight=fightno; if (sqlcode <>success){ rollback; result=0; return; } commit; result=1;return;
end
create procedure 扣除(vachar(8) ETC 卡號 in, float 費用 in ) begin update 信用卡 set 餘額=餘額-費用 from 信用卡,繫結 where 信用卡.信用卡號=繫結.繫結卡號 and ETC卡號=:ETC卡號 if error then rollback; else commit; end
//2段鎖協議 Xlock(a) x1=R(a) x1=x1-a1 W(a,x1) Unlock(a) Xlock(a) x2=R(a) x2=x2-a2 W(a,x2) Unlock(a)