数据库工程师下午试题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)

 

posted @ 2020-11-01 14:04  MiQing4in  阅读(251)  评论(0编辑  收藏  举报