锁机制

来自计算思维百科
跳转至: 导航搜索
锁机制1.jpg

当你需要访问数据库中的某个数据项时,如果数据库管理系统允许,那么你将会持有这个数据项的锁,其他任何人都不能修改这个数据项。数据库中设置锁的目的就是方式多个人访问相同数据时产生的异常。

基本概念

锁机制2.jpg

首先我们来看两个人同时做一件事可能产生的问题。例如,两个客户修改一个余额,客户A把余额从6000元改为8000元,用户B把余额从8000改为6000元,则用户A的更新就丢失了,他可能会感到很奇怪:为什么我存了两千块钱进去账户余额不会增加两千元?
又例如网上订票系统,春节前期,两个想回家的人同时看到订票网站只剩下一张票了,A犹豫了一下看看要不要回家,B一看到只剩下一张票就马上点击订票按钮,于是B就成功订票成功了,此时已经没有票了,可是A的网页没有刷新,他看到还有一张票,可是点击订票的时候却提示说火车票已经卖完了。

什么是锁机制:

为了解决上面的两个问题,系统必须对并发事务加以控制,于是一种叫做锁机制的并发控制方法就诞生了。锁机制就是只允许事事务访问当前该事物持有锁的数据项(数据项可能是一行记录,或者一张表,几张表也有可能),也就是说,只有当你拥有某个数据项的锁时,你才可以访问这个数据项,如果你没有规定的锁,那么就不好意思了,你没有访问这个数据项的权利。

锁的类型:数据库中给数据项加锁的方式有很多,但在这里我们只讨论两种锁:

1.共享锁:如果事务1获得了数据项Q的共享锁,则事务1只能读这个数据项,不能写这个数据项,但好处在于别的事务也可以拥有数据项Q的共享锁,从而可以同时读取数据项的值;仔细想想,如果两个事务都读取同一个数据项的话,这是不会产生冲突的;因为两个事务都只是看看,并没有修改的意思,所以就不会产生数据丢失和读取错误;

2.排他锁:如果事务1获得了数据项Q的排他锁,那么事务1既可以对数据项Q读,也可以写入新的数据;但其他事务就不可以同时访问这个数据项了,所以它叫排他锁。

那么问题来了:究竟让谁来负责把不同的锁分配给不同的数据项呢?于是有人发明了并发控制管理器,专门负责把锁交给事务。首先事务根据自己对数据项的操作申请某种类型的锁,优先考虑共享锁,因为这个可以提高并发性,如果要向数据项写入值,就只能申请排它锁了,管理器收到来自事务的申请后,看看有没有其他事务访问这个数据项,如果没有就分配给他,然后事务才能继续其操作。

应用范围

当不允许两个不同对象同时访问同一个资源的时候,就可以利用锁机制的思维解决办法。

使用方法及步骤

1.确定哪些情况不可以同时进行;

2.确定用什么方式来实现锁;

3.合理分配锁;

应用案例

应用1-公共储物柜

在商场上,游泳馆上,我们经常看到有公共储物柜给不同用户存放他们自己的物品。可是,两个用户用一个储物柜不好,因为怕用户拿错东西,把别人的东西拿走了。所以在某个时刻,一个储物柜只能由一个用户使用;所以公共储物柜会配置了锁;如果有用户占用了某个储物柜,这个柜子就会上锁;当用户不用的时候,就会解锁。其实上面的锁机制就是从这种管理办法学来的。

可以体现的计算思维

锁机制的发明体现了计算思维的启发式特点,人们从日常生活中的习惯总结出每种规则,发现这恰好可以满足数据库系统构建的需要。同时,锁机制还体现了计算思维的纠错容错思想,保证了数据的一致性。