1. 程式人生 > 實用技巧 >資料庫工程師下午試題5 :事務與鎖

資料庫工程師下午試題5 :事務與鎖

共享鎖(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)