|
|
51CTO旗下网站
|
|
移动端

2.1 基本概念(3)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为基本概念。

作者:猿媛之家来源:机械工业出版社|2017-12-07 11:09

2.1 基本概念(3)

【真题 292】数据库以及线程发生死锁的原理及必要条件是什么?如何避免死锁?

答案:所谓死锁指的是两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,如果无外力作用,那么它们都将无法推进下去。此时,称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。举一个简单例子加以说明死锁,人多好办事,在程序里面也是如此,所以,如果一个程序需要并行处理多个任务,那么就可以创建多个线程,但是线程多了,往往会产生冲突,当一个线程锁定了一个资源 A,而又想去锁定资源 B,而在另一个线程中,锁定了资源 B,而又想去锁定资源 A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行,此时就是死锁。

产生死锁的原因主要有以下三个方面的内容:

①系统资源不足。

②进程运行推进的顺序不合适。

③资源分配不当。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则,就会因争

夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件,分别为:

①互斥(资源独占):一个资源每次只能被一个进程使用。

②请求与保持(部分分配,占有申请):一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)。

③不可剥夺(不可强占):资源申请者不能强行地从资源占有者手中夺取资源,资源只能由占有者自愿释放。

④循环等待:若干进程之间形成一种头尾相接的循环等待资源关系。例如,存在一个进程等待队列 {P1 , P2 , … , Pn},其中 P1等待 P2占有的资源, P2等待 P3占有的资源, …,Pn等待 P1占有的资源,形成一个进程等待环路。

以上四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

预防死锁的方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

避免死锁采用的方法是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。具体方法有:

①一次封锁法:每个进程(事务)将所有要使用的数据全部加锁,否则,就不能继续执行。

②顺序封锁法:预先对数据对象规定一个封锁顺序,所有进程(事务)都按照这个顺序加锁。

③银行家算法:保证进程处于安全进程序列。
下列方法有助于最大限度地降低死锁:

①按同一顺序访问对象。

②避免事务中的用户交互。

③保持事务简短并在一个批处理中。

④使用低隔离级别。

【真题 293】列出数据库中常用的锁及其应用场景。

答案:锁是网络数据库中的一个非常重要的概念,当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性。以商场的试衣间为例,每个试衣间都可供多个消费者使用,因此,可能出现多个消费者同时需要使用试衣间试衣服。为了避免冲突,试衣间装了锁,某一个试衣服的人在试衣间里把锁锁住了,其他顾客就不能再从外面打开了,只能等待里面的顾客试完衣服,从里面把锁打开,外面的人才能进去。

各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。在数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式:共享锁、修改锁、独占锁、结构锁、意向锁和批量修改锁等。

以下将主要介绍几个最常用的锁。

(1)共享锁

共享锁也称为 S(Share Lock)锁,用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。它具有以下性质:多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕, S锁立即被释放。在 SQL Server中,默认情况下,数据被读取后,立即释放共享锁。例如,执行查询语句“ SELECT * FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和 SELECT语句中的锁定设置都可以改变 SQL Server的这种默认设置。例如,语句

“SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。

(2)排他锁

排他锁(Exclusive Lock,也叫 X锁)也叫写锁( X)。表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。例如,某个顾客把试衣间从里面反锁了,其他顾客想要使用这个试衣间,就只有等待锁从里面给打开了。排他锁具有以下几点性质:仅允许一个事务封锁此页;其他任何事务必须等到 X锁被释放才能对该页进行访问; X锁一直到事务结束才能被释放。

产生排他锁的 SQL语句如下所示: select * from ad_plan for update;

(3)更新锁

更新锁(也叫 U锁)在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为,当使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排他锁,然后再执行修改操作。这样,如果有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排他锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排他锁,就可以避免死锁。

更新锁具有以下性质:用来预定要对此页施加 X锁,它允许其他事务读,但不允许再施加 U锁或 X锁;当被读取的页将要被更新时,则升级为 X锁;U锁一直到事务结束时才能被释放。

从程序员的角度看,分为乐观锁和悲观锁。悲观锁( Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以,每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block(阻塞),直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁、读锁和写锁等,都是在做操作之前先上锁。乐观锁( Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以,不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,如果数据库提供类似于 write_condition机制,其实都是提供的乐观锁。

【真题 294】在下面的描述中,不属于数据库安全性的措施的是()。

A.普通 ZIP压缩存储  B.关联加密存储  C.数据分级

D.授权限制  E.数据多机备份

答案:A、C。

数据库的安全性指的是保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。数据库的安全性与计算机系统的安全性,包括操作系统、网络系统的安全性是紧密联系、相互支持的。常用的数据库安全措施有用户标识和鉴别、用户存取权限控制、定义视图、数据加密、安全审计以及事务管理和

故障恢复等几类。以下将分别对这几类方法进行讲解。

(1)用户标识和鉴别用户标识和鉴别的方法是由系统提供一定的方式让用户标识自己的身份,系统内部记录着所有合法

用户的标识,每次用户要求进入系统时,由系统进行核实,通过鉴定后才提供其使用权。
为了鉴别用户身份,一般采用以下几种方法:

①利用只有用户知道的信息鉴别用户。

②利用只有用户具有的物品鉴别用户。

③利用用户的个人特征鉴别用户。



喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读——网络安全(第2版)

本书是在《网管员必读—网络安全》第1版的基础上修改而成的。新版在保留第1版实用内容的基础上增加了大量新的实用内容,同时删除了一些过时...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊