数据库工程师下午试题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)
没有撤退可言!