并发与锁定

当多用户同一时刻访问相同的数据库资源时,将产生并发。并发极易破坏数据的一致性。锁定是处理并发的重要手段,用户在修改某一资源前,必须首先获得资源的修改权。而这种修改权具有排他性。

并发与锁定举例

更新表中记录首先获得该记录上的排它锁,从而防止两个进程同时修改同一条记录。

update students set student_name='张军' where student_id=16;
当用户更新记录时,将获得在该记录上的排它锁,只有事务结束,该锁定才会被释放。

死锁

死锁是指2个进程都尝试获取对方已获得的锁,从而导致双方互相等待。如果没有对应的处理措施,那么这种状态将一直持续下去。

当死锁发生时,Oracle总是自动检测死锁,并强制其中一个事务放弃原任务,这样,只保证其中一个事务能够正常完成。

悲观锁与乐观锁

锁分为2种:悲观锁和乐观锁。

悲观锁是指,当前进程在每次更新数据时,总是假设有其他进程正在锁定同一资源;

乐观锁则假定不存在锁定请求资源的其他进程。

Oracle中的悲观锁定

锁定表中记录可以利用for Update
select * from students where student_id=1 for update
在锁定时利用nowait,指定数据库不必等待,直接放弃锁定操作
select * from students where student_id=1 for update nowait
此时会报错,表示资源忙,锁定失败,如果不加nowait,该进程会一直等待第一个进程释放资源。

Oracle中的乐观锁定

A用户和B用户同时修改一个记录时

更新数据时的并发问题的解决办法为将表的所有列作为过滤条件。

update students set student_age=20 where student_id=1 and student_name='金瑞' and student_age=26 and status='cxl'
由于B用户已经修改了数据。A用户用原来的数据作为条件更新时,就匹配不到这条记录,所以A会更新失败。

除了利用所有列作为过滤条件外,可以利用version列实现相同功能

1.给表students中新增列version,默认值为0
alter table students and version number default 0;
2.更新时,将version列加入过滤条件
update students set student_age=19 where student_id=1 and version=0;
3.再执行update students set version=version+1 where student_id=1 and version=0;

第三种方式是利用时间戳列来代替version列,并将时间戳加入过滤条件、每次更新成功,利用当前时间戳来更新时间戳列

锁定转换

一个数据库中,某一时刻可能存在着多个锁,而且,当数据库状态发生改变时,锁的数量也可能随之膨胀。在sql server中,利用链表来维护和管理锁。当一个事务中的锁的数量达到升级门限时,sql进行锁定升级,而Oracle则完全摒弃了这种做法。

一般数据库中的锁定升级

sql server 所能管理的锁的数量是有限制的。当某个表上锁定超过了一定数量,sql server通过提升锁的粒度来减少锁定的数量。例如,students表上可能有多个行级锁,当锁的数量达到一定极限时,这些行级锁将被转换为一个表级锁。通过这种方式,sql server将数据库的锁的数量维持在某个水平之下。

锁定升级的好处是可以很容易的维护锁的数量,但是由于一个独占锁在同一时刻只能为一个事务所拥有,因此,锁定升级往往以损失事务并发为代价。

Oracle中的锁定转换

Oracle的锁定信息是以属性的形式,直接存储于数据款和数据行(表记录)之上。换句话说,Oracle数据的存储结构已经为是否锁定、锁的类型,以及被哪个事务锁定等信息预留了存储空间。无论一条记录是否被锁定,都会有相应的标志位进行标识。每当一个事务尝试在某些数据上加锁时,首先要访问数据本身的标志位,以验证是否允许锁定。

这样,在一个事务中,为1条记录和为100天松记录添加行级锁,Oracle维护的空间及开销是大致相同的。事实上,Oracle只是添加一个锁,并更新被锁定数据本身的属性信息。因为没有锁列表的存在,Oracle也不必进行锁定升级。

锁定转换的意义在于,对于一个dml操作,如果需要进行数据锁定,Oracle总是尽量使锁的独占性最低。当真正需要进行数据操作时,才会将独占性提高。也就是说,Oracle所创建的锁总是保持着‘够用即可’的状态,以尽量减少对其他事务请求同一资源时的影响。
在这里插入图片描述

悲观锁适合并发数不大的情况下。

乐观锁适合并发较高的情况。

posted on 2018-10-18 10:09  NE_STOP  阅读(10)  评论(0编辑  收藏  举报  来源