数据库死锁问题

数据库死锁问题
数据库死锁问题

SPID的几种状态标识

Background SPID 正在执行后台任务。

Sleeping SPID 当前并未执行。它通常表示该SPID 正在等待应用程序发出命令。

Runnable SPID 当前正在执行。

Dormant 类似于Sleeping,但Dormant 还表示SPID 在完成一个RPC 事件后已被重置。重置操作清除了执行RPC 事件过程中使用的资源。这是一种正常状态,SPID 不仅可用,并正在等待执行后续命令。Rollback 该SPID 处于事务回滚状态。

Defwakeup 表示SPID 正在等待处于释放过程的资源。waitresource 字段应表示正被讨论的资源。Spinloop 进程在尝试获取用于SMP 系统上的并发控制的spinlock 时正处于等待状态。

死锁可以查一下:

1:sp_who 或sp_who2

2: Select * from sysprocesses where blocked <> 0

3: 企业管理器->服务器->管理工具->活动->当前活动然后把他kill掉。。。

进程信息中,如果发现旁边有一个锁状的图标,就表明这个进程是死锁,kill掉

4:SQL事件探查器,监控一下,看主要是那些处理引起的死锁.然后做相应的处理.

用事件探查器new一个trace,监视一下造成你sqlserver停顿的情况。。。

最好的办法还是检查一下引起锁的原因,一般是由你的代码引起的。

查看sqlserver被锁的表以及如何解锁

查看被锁表:

https://www.360docs.net/doc/4914758089.html,

select request_session_id spid,OBJECT_NAME(resource_associated_entit y_id) tableName

from sys.dm_tran_locks where resource_type='OBJECT'

spid 锁表进程

tableName 被锁表名

解锁:

declare @spid int

Set @spid = 57 --锁表进程

declare @sql varchar(1000)

set @sql='kill '+cast(@spid as varchar)

exec(@sql)

https://www.360docs.net/doc/4914758089.html,/fk/blog_120150478.html数据库死锁及解决死锁问题

Sleeping:SPID 当前并未执行。它通常表示该 SPID 正在等待应用程序发出命令。

看看spid对应的sql语句是什么,对它进行优化,然后看看sql语句操作的表是否有比较频繁的资源竞争,对和这个表相关的其他语句也要进行优化

1. 死锁原理

根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

死锁的四个必要条件:

互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

对应到SQL Server中,当在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁;这些资源可能是:单行(RID,堆

中的单行)、索引中的键(KEY,行锁)、页(PAG,8KB)、区结构(EXT,连续的8页)、堆或B 树(HOBT) 、表(TAB,包括数据和索引)、文件(File,数据库文件)、应用程序专用资源(APP)、元数据(METADATA)、分配单元(Allocation_Unit)、整个数据库(DB)。一个死锁示例如下图所示:

说明:T1、T2表示两个任务;R1和R2表示两个资源;由资源指向任务的箭头(如

R1->T1,R2->T2)表示该资源被改任务所持有;由任务指向资源的箭头(如T1->S2,

T2->S1)表示该任务正在请求对应目标资源;

其满足上面死锁的四个必要条件:

(1).互斥:资源S1和S2不能被共享,同一时间只能由一个任务使用;

(2).请求与保持条件:T1持有S1的同时,请求S2;T2持有S2的同时请求S1;

(3).非剥夺条件:T1无法从T2上剥夺S2,T2也无法从T1上剥夺S1;

(4).循环等待条件:上图中的箭头构成环路,存在循环等待。

2. 死锁排查

(1). 使用SQL Server的系统存储过程sp_who和sp_lock,可以查看当前数据库中的锁情况;进而根据objectID(@objID)(SQL Server 2005)/ object_name(@objID)(Sql Server 2000)可以查看哪个资源被锁,用dbcc ld(@blk),可以查看最后一条发生给SQL Server的Sql语句;

CREATE Table #Who(spid int,

ecid int,

status nvarchar(50),

loginname nvarchar(50),

hostname nvarchar(50),

blk int,

dbname nvarchar(50),

cmd nvarchar(50),

request_ID int);

CREATE Table #Lock(spid int,

dpid int,

objid int,

indld int,

[Type]nvarchar(20),

Resource nvarchar(50),

Mode nvarchar(10),

Status nvarchar(10)

);

INSERT INTO #Who

EXEC sp_who active --看哪个引起的阻塞,blk

INSERT INTO #Lock

EXEC sp_lock --看锁住了那个资源id,objid

DECLARE@DBName nvarchar(20);

SET@DBName='NameOfDataBase'

SELECT #Who.*FROM #Who WHERE dbname=@DBName

SELECT #Lock.*FROM #Lock

JOIN #Who

ON #Who.spid=#Lock.spid

AND dbname=@DBName;

--最后发送到SQL Server的语句

DECLARE crsr Cursor FOR

SELECT blk FROM #Who WHERE dbname=@DBName AND blk<>0; DECLARE@blk int;

open crsr;

FETCH NEXT FROM crsr INTO@blk;

WHILE (@@FETCH_STATUS=0)

BEGIN;

dbcc inputbuffer(@blk);

FETCH NEXT FROM crsr INTO@blk;

END;

close crsr;

DEALLOCATE crsr;

--锁定的资源

SELECT #Who.spid,hostname,objid,[type],mode,object_name(objid) as objNa me FROM #Lock

JOIN #Who

ON #Who.spid=#Lock.spid

AND dbname=@DBName

WHERE objid<>0;

DROP Table #Who;

DROP Table #Lock;

(2). 使用 SQL Server Profiler 分析死锁: 将 Deadlock graph 事件类添加到跟踪。此事件类使用死锁涉及到的进程和对象的 XML 数据填充跟踪中的 TextData 数据列。SQL Server 事件探查器可以将 XML 文档提取到死锁 XML (.xdl) 文件中,以后可在 SQL Server Management Studio 中查看该文件。

3. 避免死锁

上面1中列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件,就可以避免死锁发生,一般有以下几种方法(FROM Sql Server 2005联机丛书):

(1).按同一顺序访问对象。(注:避免出现循环)

(2).避免事务中的用户交互。(注:减少持有资源的时间,较少锁竞争)

(3).保持事务简短并处于一个批处理中。(注:同(2),减少持有资源的时间)

(4).使用较低的隔离级别。(注:使用较低的隔离级别(例如已提交读)比使用较高的隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)

(5).使用基于行版本控制的隔离级别:2005中支持快照事务隔离和指定

READ_COMMITTED隔离级别的事务使用行版本控制,可以将读与写操作之间发生的死锁几率降至最低:

SET ALLOW_SNAPSHOT_ISOLATION ON --事务可以指定 SNAPSHOT 事务隔离级别; SET READ_COMMITTED_SNAPSHOT ON --指定 READ_COMMITTED 隔离级别的事务将使用行版本控制而不是锁定。默认情况下(没有开启此选项,没有加with nolock提示),SELECT语句会对请求的资源加S锁(共享锁);而开启了此选项后,SELECT不会对请求的资源加S锁。

注意:设置 READ_COMMITTED_SNAPSHOT 选项时,数据库中只允许存在执行 ALTER DATABASE 命令的连接。在 ALTER DATABASE 完成之前,数据库中决不能有其他打开的连接。数据库不必一定要处于单用户模式中。

(6).使用绑定连接。(注:绑定会话有利于在同一台服务器上的多个会话之间协调操作。绑定会话允许一个或多个会话共享相同的事务和锁(但每个回话保留其自己的事务隔离级别),并可以使用同一数据,而不会有锁冲突。可以从同一个应用程序内的多个会话中创建绑定会话,也可以从包含不同会话的多个应用程序中创建绑定会话。在一个会话中开启事务(begin tran)后,调用exec sp_getbindtoken @Token out;来取得Token,然后传入

另一个会话并执行EXEC sp_bindsession @Token来进行绑定(最后的示例中演示了绑定连接)。

4. 死锁处理方法:

(1). 根据2中提供的sql,查看那个spid处于wait状态,然后用kill spid来干掉(即破坏死锁的第四个必要条件:循环等待);当然这只是一种临时解决方案,我们总不能在遇到死锁就在用户的生产环境上排查死锁、Kill sp,我们应该考虑如何去避免死锁。

(2). 使用SET LOCK_TIMEOUT timeout_period(单位为毫秒)来设定锁请求超时。默认情况下,数据库没有超时期限(timeout_period值为-1,可以用SELECT

@@LOCK_TIMEOUT来查看该值,即无限期等待)。当请求锁超过timeout_period时,将返回错误。timeout_period值为0时表示根本不等待,一遇到锁就返回消息。设置锁请求超时,破环了死锁的第二个必要条件(请求与保持条件)。

服务器: 消息 1222,级别 16,状态 50,行 1

已超过了锁请求超时时段。

(3). SQL Server内部有一个锁监视器线程执行死锁检查,锁监视器对特定线程启动死锁搜索时,会标识线程正在等待的资源;然后查找特定资源的所有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个构成死锁条件的循环。检测到死锁后,数据库引擎选择运行回滚开销最小的事务的会话作为死锁牺牲品,返回1205 错误,回滚死锁牺牲品的事务并释放该事务持有的所有锁,使其他线程的事务可以请求资源并继续运行。

5. 两个死锁示例及解决方法

5.1 SQL死锁

(1). 测试用的基础数据:

CREATE TABLE Lock1(C1 int default(0));

CREATE TABLE Lock2(C1 int default(0));

INSERT INTO Lock1 VALUES(1);

INSERT INTO Lock2 VALUES(1);

(2). 开两个查询窗口,分别执行下面两段sql

--Query 1

Begin Tran

Update Lock1 Set C1=C1+1;

WaitFor Delay '00:01:00';

SELECT*FROM Lock2

Rollback Tran;

--Query 2

Begin Tran

Update Lock2 Set C1=C1+1;

WaitFor Delay '00:01:00';

SELECT*FROM Lock1

Rollback Tran;

上面的SQL中有一句WaitFor Delay '00:01:00',用于等待1分钟,以方便查看锁的情况。

(3). 查看锁情况

在执行上面的WaitFor语句期间,执行第二节中提供的语句来查看锁信息:

Query1中,持有Lock1中第一行(表中只有一行数据)的行排他锁(RID:X),并持有该行所在页的意向更新锁(PAG:IX)、该表的意向更新锁(TAB:IX);Query2中,持有Lock2中第一行(表中只有一行数据)的行排他锁(RID:X),并持有该行所在页的意向更新锁(PAG:IX)、该表的意向更新锁(TAB:IX);

执行完Waitfor,Query1查询Lock2,请求在资源上加S锁,但该行已经被Query2加上了X锁;Query2查询Lock1,请求在资源上加S锁,但该行已经被Query1加上了X 锁;于是两个查询持有资源并互不相让,构成死锁。

(4). 解决办法

a). SQL Server自动选择一条SQL作死锁牺牲品:运行完上面的两个查询后,我们会发现有一条SQL能正常执行完毕,而另一个SQL则报如下错误:

服务器: 消息 1205,级别 13,状态 50,行 1

事务(进程 ID xx)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

这就是上面第四节中介绍的锁监视器干活了。

b). 按同一顺序访问对象:颠倒任意一条SQL中的Update与SELECT语句的顺序。例如修改第二条SQL成如下:

--Query2

Begin Tran

SELECT*FROM Lock1--在Lock1上申请S锁

WaitFor Delay '00:01:00';

Update Lock2 Set C1=C1+1;--Lock2:RID:X

Rollback Tran;

当然这样修改也是有代价的,这会导致第一条SQL执行完毕之前,第二条SQL一直处于阻塞状态。单独执行Query1或Query2需要约1分钟,但如果开始执行Query1时,马上同时执行Query2,则Query2需要2分钟才能执行完;这种按顺序请求资源从一定程度上降低了并发性。

c). SELECT语句加With(NoLock)提示:默认情况下SELECT语句会对查询到的资源加S锁(共享锁),S锁与X锁(排他锁)不兼容;但加上With(NoLock)后,SELECT不对查询到的资源加锁(或者加Sch-S锁,Sch-S锁可以与任何锁兼容);从而可以是这两条SQL 可以并发地访问同一资源。当然,此方法适合解决读与写并发死锁的情况,但加

With(NoLock)可能会导致脏读。

SELECT*FROM Lock2 WITH(NOLock)

SELECT*FROM Lock1 WITH(NOLock)

d). 使用较低的隔离级别。SQL Server 2000支持四种事务处理隔离级别(TIL),分别为:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE;SQL Server 2005中增加了SNAPSHOT TIL。默认情况下,SQL Server使用READ COMMITTED TIL,我们可以在上面的两条SQL前都加上一句SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,来降低TIL以避免死锁;事实上,运行在READ UNCOMMITTED TIL的事务,其中的SELECT语句不对结果资源加锁或加Sch-S 锁,而不会加S锁;但还有一点需要注意的是:READ UNCOMMITTED TIL允许脏读,虽然加上了降低TIL的语句后,上面两条SQL在执行过程中不会报错,但执行结果是一个返回1,一个返回2,即读到了脏数据,也许这并不是我们所期望的。

e). 在SQL前加SET LOCK_TIMEOUT timeout_period,当请求锁超过设定的timeout_period时间后,就会终止当前SQL的执行,牺牲自己,成全别人。

f). 使用基于行版本控制的隔离级别(SQL Server 2005支持):开启下面的选项后,SELECT不会对请求的资源加S锁,不加锁或者加Sch-S锁,从而将读与写操作之间发生的死锁几率降至最低;而且不会发生脏读。啊

SET ALLOW_SNAPSHOT_ISOLATION ON

SET READ_COMMITTED_SNAPSHOT ON

g). 使用绑定连接(使用方法见下一个示例。)

5.2 程序死锁(SQL阻塞)

看一个例子:一个典型的数据库操作事务死锁分析,按照我自己的理解,我觉得这应该算是C#程序中出现死锁,而不是数据库中的死锁;下面的代码模拟了该文中对数据库的操作过程://略去的无关的code

SqlConnection conn =new SqlConnection(connectionString);

conn.Open();

SqlTransaction tran = conn.BeginTransaction();

string sql1 ="Update Lock1 SET C1=C1+1";

string sql2 ="SELECT * FROM Lock1";

ExecuteNonQuery(tran, sql1); //使用事务:事务中Lock了Table ExecuteNonQuery(null, sql2); //新开一个connection来读取Table

public static void ExecuteNonQuery(SqlTransaction tran, string sql)

{

SqlCommand cmd =new SqlCommand(sql);

if (tran !=null)

{

cmd.Connection = tran.Connection;

cmd.Transaction = tran;

cmd.ExecuteNonQuery();

}

else

{

using (SqlConnection conn =new SqlConnection(connectionString))

{

conn.Open();

cmd.Connection = conn;

cmd.ExecuteNonQuery();

}

}

}

执行到ExecuteNonQuery(null, sql2)时抛出SQL执行超时的异常,下图从数据库的角度来看该问题:

代码从上往下执行,会话1持有了表Lock1的X锁,且事务没有结束,回话1就一直持有X锁不释放;而会话2执行select操作,请求在表Lock1上加S锁,但S锁与X 锁是不兼容的,所以回话2的被阻塞等待,不在等待中,就在等待中获得资源,就在等待中超时。。。从中我们可以看到,里面并没有出现死锁,而只是SELECT操作被阻塞了。也正因为不是数据库死锁,所以SQL Server的锁监视器无法检测到死锁。

我们再从C#程序的角度来看该问题:

C#程序持有了表Lock1上的X锁,同时开了另一个SqlConnection还想在该表上请求一把S锁,图中已经构成了环路;太贪心了,结果自己把自己给锁死了。。。

虽然这不是一个数据库死锁,但却是因为数据库资源而导致的死锁,上例中提到的解决死锁的方法在这里也基本适用,主要是避免读操作被阻塞,解决方法如下:

a). 把SELECT放在Update语句前:SELECT不在事务中,且执行完毕会释放S 锁;

b). 把SELECT也放加入到事务中:ExecuteNonQuery(tran, sql2);

c). SELECT加With(NOLock)提示:可能产生脏读;

d). 降低事务隔离级别:SELECT语句前加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;同上,可能产生脏读;

e). 使用基于行版本控制的隔离级别(同上例)。

g). 使用绑定连接:取得事务所在会话的token,然后传入新开的connection中;执行EXEC sp_bindsession @Token后绑定了连接,最后执行exec sp_bindsession null;来取消绑定;最后需要注意的四点是:

(1). 使用了绑定连接的多个connection共享同一个事务和相同的锁,但各自保留自己的事务隔离级别;

(2). 如果在sql3字符串的“exec sp_bindsession null”换成“commit tran”或者“rollback tran”,则会提交整个事务,最后一行C#代码https://www.360docs.net/doc/4914758089.html,mit()就可以不用执行了(执行会报错,因为事务已经结束了-,-)。

(3). 开启事务(begin tran)后,才可以调用exec sp_getbindtoken @Token out 来取得Token;如果不想再新开的connection中结束掉原有的事务,则在这个connection

close之前,必须执行“exec sp_bindsession null”来取消绑定连接,或者在新开的connectoin close之前先结束掉事务(commit/tran)。

(4). (Sql server 2005 联机丛书)后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。请改用多个活动结果集(MARS) 或分布式事务。

tran = connection.BeginTransaction();

string sql1 ="Update Lock1 SET C1=C1+1";

ExecuteNonQuery(tran, sql1); //使用事务:事务中Lock了测试表Lock1

string sql2 =@"DECLARE @Token varchar(255);

exec sp_getbindtoken @Token out;

SELECT @Token;";

string token = ExecuteScalar(tran, sql2).ToString();

string sql3 ="EXEC sp_bindsession @Token;Update Lock1 SET C1=C1+1;exe c sp_bindsession null;";

SqlParameter parameter =new SqlParameter("@Token", SqlDbType.VarChar); parameter.Value = token;

ExecuteNonQuery(null, sql3, parameter); //新开一个connection来操作测试表Lock1

https://www.360docs.net/doc/4914758089.html,mit();

数据库死锁问题总结

数据库死锁问题总结 1、死锁(Deadlock) 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造 成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系 统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力 协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象 死锁。一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每 个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记 录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发 生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是 程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。 锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协 议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。(回滚 一个,让另一个进程顺利进行) 产生死锁的原因主要是: (1)系统资源不足。 (2)进程运行推进的顺序不合适。 (3)资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能 性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序 与速度不同,也可能产生死锁。 产生死锁的四个必要条件: (1)互斥条件:一个资源每次只能被一个进程使用。 (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 破解:静态分配(分配全部资源) (3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 破解:可剥夺 (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 破解:有序分配 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 死锁的预防和解除:

第3章死锁习题及答案

第三章死锁习题 一、填空题 1.进程的“同步”和“互斥”反映了进程间①和②的关系。 【答案】①直接制约、②间接制约 【解析】进程的同步是指在异步环境下的并发进程因直接制约而互相发送消息,进行相互合作、相互等待,使得各进程按一定的速度执行的过程;而进程的互斥是由并发进程同时共享公有资源而造成的对并发进程执行速度的间接制约。 2.死锁产生的原因是①和②。 【答案】①系统资源不足、②进程推进路径非法 【解析】死锁产生的根本原因是系统的资源不足而引发了并发进程之间的资源竞争。由于资源总是有限的,我们不可能为所有要求资源的进程无限地提供资源。而另一个原因是操作系统应用的动态分配系统各种资源的策略不当,造成并发进程联合推进的路径进入进程相互封锁的危险区。所以,采用适当的资源分配算法,来达到消除死锁的目的是操作系统主要研究的课题之一。 3.产生死锁的四个必要条件是①、②、③、④。 【答案】①互斥条件、②非抢占条件、③占有且等待资源条件、④循环等待条件 【解析】 互斥条件:进程对它所需的资源进行排它性控制,即在一段时间内,某资源为一进程所独占。 非抢占条件:进程所获得的资源在未使用完毕之前,不能被其它进程强行夺走,即只能由获得资源的进程自己释放。 占有且等待资源条件:进程每次申请它所需的一部分资源,在等待新资源的同时,继续占有已分配到的资源, 循环等待条件:存在一进程循环链,链中每一个进程已获得的资源同时被下一个进程所请求。 4.在操作系统中,信号量是表示①的物理实体,它是一个与②有关的整型变量,其值仅能由③原语来改变。 【答案】①资源,②队列,③P-V 【解析】信号量的概念和P-V原语是荷兰科学家E.W.Dijkstra提出来的。信号量是一个特殊的整型量,它与一个初始状态为空的队列相联系。信号量代表了资源的实体,操作系统利用它的状态对并发进程共享资源进行管理。信号量的值只能由P-V原语来改变。 5.每执行一次P原语,信号量的数值S减1。如果S>=0,该进程①;若S<0,则②该进程,并把它插入该③对应的④队列中。 【答案】①继续执行,②阻塞(等待),③信号量,④阻塞(等待) 【解析】从物理概念上讲,S>0时的数值表示某类资源可用的数量。执行一次P原语,意味着请求分配一个单位的资源,因此描述为S=S-1。当S<0时,表示已无资源,这时请求资源的进程将被阻塞,把它排在信号量S的等待队列中。此时,S的绝对值等于信号量队列上的阻塞的进程数目。 6.每执行一次V原语,信号量的数值S加1。如果①,Q进程继续执行;如果S<=0,则从对应的②队列中移出一个进程R,该进程状态变为③。 【答案】①S>0,②等待,③就绪 【解析】执行一次V原语,意味着释放一个单位的资源。因此,描述为S=S+1。当S<0时,表示信号量请求队列中仍然有因请求该资源而被阻塞的进程。因此,应将信号量对应的阻塞队列中的第一个进程唤醒,使之转至就绪队列。 7.利用信号量实现进程的①,应为临界区设置一个信号量mutex。其初值为②,表示该资源尚未使用,临界区应置于③和④原语之间。

ACCESS数据库锁定问题

ACCESS数据库锁定问题 问题1 单位网站突然有的时候不能打开网页。重启电脑后问题解决。说是CONN.ASP第6行错误。同时生成一个.LDB文件。在网上查了下说是数据库没有关闭或锁定了。请问如何关闭啊,下边是CONN.ASP代码: <% starttime=timer() StrSQL="DBQ="+server.mappath("admin/data/news30000.mdb")+";DRIVER={Microsoft Access Driver (*.mdb)};" 'connstr="driver={SQL Server};server=(local);database=master;uid=sa;pwd=;" set conn=server.createobject("ADODB.CONNECTION") conn.open StrSQL(第6行) %> 答: 如果是ACCESS数据库,应该是并发访问造成的问题。因为ACCESS没有行锁。所以你有个一个用户在网上改一条数据,另外一个用户再上来访问相同一条数据时就给锁了。重启动后所有的连接全断开了,所以就没问题了。如果有可能最好不用ACCESS做后台数据库。 ---------------------------------- 问题2 我的数据库老是被锁住,网页打不开,请高手帮忙!!我的conn.asp是:<% scadb=mydata&"datahotel/#@@##feel.mdb" 'mydata 为各文件中设置的路径,请不要改动 connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&scadb&"") On Error Resume Next Set conn = Server.CreateObject("ADODB.Connection") conn.open connstr If Err Then err.Clear Set Conn = Nothing Response.Write "




数据库连接出错!!!请检查数据库连接指向^--^
" Response.End End If%> 答: 你的数据库连接写法是正确的,是不是数据库太大,几百M的话容易出现这个问题,建议换sql数据库。不想换的话可以把数据库下载到本地压缩修复一下再传上去。 ------------------------- 问题3

1产生死锁的根本原因是什么

第六章死锁 1.产生死锁的根本原因是什么?死锁发生的必要条件有哪些? 2.阐述预先静态分配法是如何进行死锁预防的。 3.阐述按序分配资源法是如何进行死锁预防的。 4.为什么说不能通过破坏“互斥条件”来预防死锁。 5.防止死锁的分配策略中,它们各自存在的缺点有哪些? 6.在一个真实的计算机机系统中,可用的资源和进程命令对资源的要求都不会持续很久(几个月),资源会损坏或被替换,新的进程会进入和离开系统,新的资源会被购买和添加到系统中。如果用银行家算法控制死锁,下面哪些变化是安全的(不会导致可能的死锁),并且是在什么情况下发生? a. 增加可用资源(新的资源被添加到系统) b. 减少可用资源(资源被从系统中永久性地移出) c. 增加一个进程的Max(进程需要更多的资源,超过所允许给予的资源) d. 减少一个进程的Max(进程不再需要那么多资源) e. 增加进程的数量 f. 减少进程的数量 7.考虑下面的一个系统在某一时刻的状态: Allocation Max Available A B C D A B C D A B C D P00 0 1 2 0 0 1 2 1 5 2 0 P1 1 0 0 0 1 7 5 0 P2 1 3 5 4 2 3 5 6 P30 6 3 2 0 6 5 2 P40 0 1 4 0 6 5 6 使用银行家算法回答下面问题: a. Need矩阵的内容是怎样的? b. 系统是否处于安全状态? c. 如果从进程P1发来一个请求(0,4,2,0),这个请求能否立刻被满足? 8.现有三个进程P1,P2,P3,共享A,B,C这三类资源,进程对资源的需求量和目前分配情况如下: 进程已占资源数最大需求数 A B C A B C P1 2 6 3 2 6 5 P2 2 0 1 4 5 3 P3 2 1 0 2 8 5 若系统还有剩余资源数分别为A类2个,B类6个,C类2个,请按银行家算法回答下列问题:

死锁问题解决方法

Sqlcode -244 死锁问题解决 版本说明 事件日期作者说明 创建09年4月16日Alan 创建文档 一、分析产生死锁的原因 这个问题通常是因为锁表产生的。要么是多个用户同时访问数据库导致该问题,要么是因为某个进程死了以后资源未释放导致的。 如果是前一种情况,可以考虑将数据库表的锁级别改为行锁,来减少撞锁的机会;或在应用程序中,用set lock mode wait 3这样的语句,在撞锁后等待若干秒重试。 如果是后一种情况,可以在数据库端用onstat -g ses/onstat -g sql/onstat -k等命令找出锁表的进程,用onmode -z命令结束进程;如果不行,就需要重新启动数据库来释放资源。 二、方法一 onmode -u 将数据库服务器强行进入单用户模式,来释放被锁的表。注意:生产环境不适合。 三、方法二 1、onstat -k |grep HDR+X 说明:HDR+X为排他锁,HDR 头,X 互斥。返回信息里面的owner项是正持有锁的线程的共享内存地址。 2、onstat -u |grep c60a363c 说明:c60a363c为1中查到的owner内容。sessid是会话标识符编号。 3、onstat -g ses 20287 说明:20287为2中查到的sessid内容。Pid为与此会话的前端关联的进程标识符。 4、onstat -g sql 20287

说明:20287为2中查到的sessid内容。通过上面的命令可以查看执行的sql语句。 5、ps -ef |grep 409918 说明:409918为4中查到的pid内容。由此,我们可以得到锁表的进程。可以根据锁表进程的重要程度采取相应的处理方法。对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sessid的方法杀掉锁表session。否则也可以直接杀掉锁表的进程 kill -9 pid。 四、避免锁表频繁发生的方法 4.1将页锁改为行锁 1、执行下面sql语句可以查询当前库中所有为页锁的表名: select tabname from systables where locklevel='P' and tabid > 99 2、执行下面语句将页锁改为行锁 alter table tabname lock mode(row) 4.2统计更新 UPDATE STATISTICS; 4.3修改数据库配置onconfig OPTCOMPIND参数帮助优化程序为应用选择合适的访问方法。 ?如果OPTCOMPIND等于0,优化程序给予现存索引优先权,即使在表扫描比较快时。 ?如果OPTCOMPIND设置为1,给定查询的隔离级设置为Repeatable Read时,优化程序才使用索引。 ?如果OPTCOMPIND等于2,优化程序选择基于开销选择查询方式。,即使表扫描可以临时锁定整个表。 *建议设置:OPTCOMPIND 0 # To hint the optimizer 五、起停informix数据库 停掉informix数据库 onmode -ky 启动informix数据库 oninit 注意千万别加-i参数,这样会初始化表空间,造成数据完全丢失且无法挽回。

操作系统死锁习题集

死锁习题 一、填空题 2.死锁产生的原因是。 3.产生死锁的四个必要条件是、、、。 二、单项选择题 1.两个进程争夺同一个资源。 (A)一定死锁(B)不一定死锁 (C)不死锁(D)以上说法都不对 4.如果发现系统有的进程队

列就说明系统有可能发生死锁了。 (A)互斥(B)可剥夺 (C)循环等待(D)同步 5.预先静态分配法是通过破坏条件,来达到预防死锁目的的。 (A)互斥使用资源/循环等待资源 (B)非抢占式分配/互斥使用资源 (C) 占有且等待资源/循环等待资源 (D)循环等待资源/互斥使用资源 7.下列关于死锁的说法中,正确的是? 1)有环必死锁; 2)死锁必有环; 3)有环无死锁; 4)死锁也无环 8.资源有序分配法的目的是? 1)死锁预防; 2)死锁避免; 3)死锁检测; 4)死锁解除 8.死锁的预防方法中,不太可能的一种方法使()。

A 摈弃互斥条件 B 摈弃请求和保持条件 C 摈弃不剥夺条件 D 摈弃环路等待条件 10. 资源的按序分配策略可以破坏()条件。 A 互斥使用资源 B 占有且等待资源 C 不可剥夺资源 D 环路等待资源 三、多项选择题 1.造成死锁的原因是_________。 (A)内存容量太小(B)系统进程数量太多,系统资源分配不当 (C)CPU速度太慢(D)进程推进顺序不合适 (E)外存容量太小 2.下列叙述正确的是_________。 (A)对临界资源应采取互斥访问方式来实现共享 (B)进程的并发执行会破坏程序的“封

闭性” (C)进程的并发执行会破坏程序的“可再现性” (D)进程的并发执行就是多个进程同时占有CPU (E)系统死锁就是程序处于死循环3.通常不采用_________方法来解除死锁。 (A)终止一个死锁进程(B)终止所有死锁进程 (C)从死锁进程处抢夺资源(D)从非死锁进程处抢夺资源 (E)终止系统所有进程 5.通常使用的死锁防止策略有_________。 (A)动态分配资源(B)静态分配资源 (C)按序分配资源(D)非剥夺式分配资源 (E)剥夺式分配资源 四、名词解释 1死锁

第5章 死锁 练习题参考答案

第五章死锁练习题参考答案 (一)单项选择题 1.D 2.C 3.B 4.D 5.A 6.C 7.D (二)填空题 1.死锁2.资源管理不得当,并发执行时3.占有并等待资源,循环等待资源4.等价的5.没有死锁6.一个条件不成立7.静态分配资源,释放已占资源8.预分配资源.开始执行前9.没有占用资源10.抢夺11.主存空间,处理器12.按序分配13安全状态14.避免死锁15.银行家算法16.死锁的避免17.n(x- 1)+l<=m 18.死锁检测方法19判断系统,解除死锁20.占用表,等待表21.尚需量,剩余量22终止,抢夺资源23.校验点24.防止,检测 (三)简答题 1.若系统中存在一组进程、它们中的每—个进程都占用了某种资源而又都在等待其中另一个进程所占的资源,这种等待永远不能结束,则说明系统出现了死锁。产生死锁的原因有两个:一是操作系统对资源的管理不当,二是没有顾及进程并发执行时可能出现的情况。 2.采用某些资源分配策略使死锁的四个必要条件之一不成立,就能防止死锁。除第一个条件互斥使用资源没有对应策略外,对占有并等待资源、不可抢夺资源和循环等待资源这三个条件可采用静态分配资源,释放已占资源,抢夺式分配资源和按序分配资源等资源分配策略。 3.如果操作系统能保证所有的进程在有限的时间内得到需要的全部资源,则称系统处于安全状态。常用银行家算法动态地检测系统中的资源分配情况和进程对资源的需求情况进行资源分配,确保系统处于安全状态。 4解决死锁问题有以下三种方法:(1)死锁的防止。系统按预定的策略为进程分配资源,这些分配策略能使死锁的四个必要条件之一不成立,从而使系统不产生死锁。(2)死锁的避免。系统动态地测试资源分配情况,仅当能确保系统安全时才给进程分配资源。(3)死锁的检测。对资源的申请和分配不加限制,只要有剩余的资源就可把资源分配给申请者,操作系统要定时判断系统是否出现了死锁,当有死锁发生时设法解除死锁。5.用抢夺资源的方式解除死锁时要注意三点:(1)抢夺进程资源时希望付出的代价最小。(2)为被抢夺者的恢复准备好条件,如返回某个安全状态,并记录有关信息。(3)防止被抢夺资源的进程“饿死”,一般总是从执行时间短的进程中抢夺资源。 (四)应用题 1.(1)根据表,P1,P2和P3三个进程尚需资源数分别是4,5和1,系统的资源剩余量为2,若把剩余的资源量全部分配给P2,系统产已无资源可分配,使三个进程都等待资源而无法完成,形成死锁。所以不能先满足进程P2的要求。 (2)可先为进程P3分配1个资源,当它归还3个资源后,这样共有4个可分配资源,可满足P1申请1个资源的要求,再分配3个资源给进程P1,待P1归还7个资源后,先满足P2申请2个资源的请求,分配给进程P2,再分配3个资源给P2,使它完成。 2.(1)系统目前尚余有的资源数为(2,6,2,1),五个进程尚需的资源数分别是A:(2,0,0,0) ; B:(0,0,0,0); C:(4,6,2,0) ; D:(5,7,0,0); E:(0,0,2,1);由于进程B己满足了全部资源需求,它在有限时间内会归还这些资源,因此可分配资源达到(3,6,4,1),这样就可分配给进程A;等A归还资源后,可分配资源达到(6,12,6,1),再分配给进程C;之后可分配资源会达到(7,12,10,1),分配给进程D并等待一段时间后,可分配资源将达到(7,12,10,2),最后,可分配给进程E,满足其全部请求。所以说目前系统处于安全状态。 (2)若此时给进程D分配(2,5,0,0)个资源,进程D尚需(3,2,0,0),则系统剩余的资源量为(0,

数据库锁表与解锁

数据库锁表与解锁 一、mysql 锁定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…] 解锁表:UNLOCK TABLES 例子: LOCK TABLES table1 WRITE ,table2 READ 、、、更多表枷锁; 说明:1、READ 锁代表其她用户只能读不能其她操作 2、WRITE锁代表:其她用户不能任何操作(包括读) 查瞧那些表被锁:show OPEN TABLES where In_use > 0; 全局加锁:FLUSH TABLES WITH READ LOCK(这个命令就是全局读锁定,执行了命令之后所有库所有表都被锁定只读。解锁也就是:UNLOCK TABLES ) 二、oracle --行级锁定(同样对 mysql起作用) 通过 :select * from tableName t for update 或 select * from tableName t where id =1 for update 前者锁定整个表,后者多顶 id=1的一行数据(有主键,并且指定主键=值的只 锁定指定行) 说明:通过 select 、、、 for update 后其她用户只能读不能其她操作,锁定者通过 commit或 rollback命令自动解锁,或使用本文的解锁方式

(will)! --表级锁定 lock table in mode [nowait] 其中: lock_mode 就是锁定模式 nowait关键字用于防止无限期的等待其她用户释放锁 五种模式如下(1到5 级别越来越高,限制越来越大): 1、行共享(row share,rs):允许其她用户访问与锁定该表,但就是禁止排她锁定 整个表 2、排她锁(row exclusive ,rx):与行共享模式相同,同时禁止其她用户在此表上使用共享锁。使用select 、、、 for update语句会在表上自动应用行排她锁 3、共享(share ,s):共享锁将锁定表,仅允许其她用户查询表中的行,但不允许插入、更新、删除行。多个用户可以在同一表中放置共享锁,即允许资源共享,,因此得名“共享锁”。例如:如果用户每天都需要在结账时更新日销售额表,则可以在更新该表时使用共享锁以确保数据的一致性。 4、共享排她锁(share row exclusive,srx):执行比共享锁更多的限制。防止其 她事务在表上应用共享锁,、共享排她锁以及排她锁。 5、排她(exclusive,x):对表执行最大的限制。除了允许其她用户查询该表记录, 排她锁防止其她事务对表做任何更改或在表上应用任何类型的锁。 实例: lock table table_Name in exclusive mode; 要解锁需要锁定人执行 commit 或 rollback 或者用本文的解锁方式 (will)! --查询锁表 SELECT /*+ rule */ S、USERNAME, DECODE(L、TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,

sql server的死锁及处理方法

【转】处理sql server的死锁 --第一篇 --检测死锁 --如果发生死锁了,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程? --这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁, 但没有这里介绍的方法好用。 use master go create procedure sp_who_lock as begin declare @spid int,@bl int, @intTransactionCountOnEntry int, @intRowcount int, @intCountProperties int, @intCounter int create table #tmp_lock_who ( id int identity(1,1), spid smallint, bl smallint) IF @@ERROR<>0 RETURN @@ERROR insert into #tmp_lock_who(spid,bl) select 0 ,blocked from (select * from sysprocesses where blocked>0 ) a where not exists(select * from (select * from sysprocesses where blocked>0 ) b where a.blocked=spid) union select spid,blocked from sysprocesses where blocked>0 IF @@ERROR<>0 RETURN @@ERROR -- 找到临时表的记录数 select @intCountProperties = Count(*),@intCounter = 1 from #tmp_lock_who IF @@ERROR<>0 RETURN @@ERROR

《操作系统原理》5资源管理(死锁)习题

第五章死锁练习题 (一)单项选择题 1.系统出现死锁的根本原因是( )。 A.作业调度不当B.系统中进程太多C.资源的独占性D.资源管理和进程推进顺序都不得当 2.死锁的防止是根据( )采取措施实现的。 A.配置足够的系统资源B.使进程的推进顺序合理 C.破坏产生死锁的四个必要条件之一D.防止系统进入不安全状态 3.采用按序分配资源的策略可以防止死锁.这是利用了使( )条件不成立。 A.互斥使用资源B循环等待资源C.不可抢夺资源D.占有并等待资源 4.可抢夺的资源分配策略可预防死锁,但它只适用于( )。 A.打印机B.磁带机C.绘图仪D.主存空间和处理器 5.进程调度算法中的( )属于抢夺式的分配处理器的策略。 A.时间片轮转算法B.非抢占式优先数算法C.先来先服务算法D.分级调度算法 6.用银行家算法避免死锁时,检测到( )时才分配资源。 A.进程首次申请资源时对资源的最大需求量超过系统现存的资源量 B.进程己占用的资源数与本次申请资源数之和超过对资源的最大需求量 C.进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足尚需的最大资源量 D进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足本次申请量,但不能满足尚需的最大资源量 7.实际的操作系统要兼顾资源的使用效率和安全可靠,对资源的分配策略,往往采用( )策略。 A死锁的防止B.死锁的避免C.死锁的检测D.死锁的防止、避免和检测的混合 (二)填空题 1.若系统中存在一种进程,它们中的每一个进程都占有了某种资源而又都在等待其中另一个进程所占用的资源。这种等待永远不能结束,则说明出现了______。 2.如果操作系统对______或没有顾及进程______可能出现的情况,则就可能形成死锁。 3.系统出现死锁的四个必要条件是:互斥使用资源,______,不可抢夺资源和______。 4.如果进程申请一个某类资源时,可以把该类资源中的任意一个空闲资源分配给进程,则说该类资源中的所有资源是______。 5.如果资源分配图中无环路,则系统中______发生。 6.为了防止死锁的发生,只要采用分配策略使四个必要条件中的______。 7.使占有并等待资源的条件不成立而防止死锁常用两种方法:______和______. 8静态分配资源也称______,要求每—个进程在______就申请它需要的全部资源。 9.释放已占资源的分配策略是仅当进程______时才允许它去申请资源。 10.抢夺式分配资源约定,如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足必须等待时、系统可以______该进程已占有的资源。 11.目前抢夺式的分配策略只适用于______和______。 12.对资源采用______的策略可以使循环等待资源的条件不成立。 13.如果操作系统能保证所有的进程在有限的时间内得到需要的全部资源,则称系统处于______。14.只要能保持系统处于安全状态就可______的发生。 15.______是一种古典的安全状态测试方法。 16.要实现______,只要当进程提出资源申请时,系统动态测试资源分配情况,仅当能确保系统安全时才把资源分配给进程。

操作系统死锁练习及答案

死锁练习题 (一)单项选择题 l系统出现死锁的根本原因是( )。 A.作业调度不当 B.系统中进程太多 C.资源的独占性 D.资源管理和进程推进顺序都不得当 2.死锁的防止是根据( )采取措施实现的。 A.配置足够的系统资源 B.使进程的推进顺序合理 C.破坏产生死锁的四个必要条件之一 D.防止系统进入不安全状态 3.采用按序分配资源的策略可以防止死锁.这是利用了使( )条件不成立。 A.互斥使用资源 B循环等待资源 c.不可抢夺资源 D.占有并等待资源 4.可抢夺的资源分配策略可预防死锁,但它只适用于( )。A.打印机 B.磁带机 c.绘图仪 D.主存空间和处理器 5.进程调度算法中的( )属于抢夺式的分配处理器的策略。A.时间片轮转算法 B.非抢占式优先数算法 c.先来先服务算法 D.分级调度算法 6.用银行家算法避免死锁时,检测到( )时才分配资源。 A.进程首次申请资源时对资源的最大需求量超过系统现存的资源量 B.进程己占用的资源数与本次申请资源数之和超过对资源的最大需求量 c.进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足尚需的最大资源量 D进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足本次申请量,但不能满足尚需的最大资源量 7.实际的操作系统要兼顾资源的使用效率和安全可靠,对资源的分配策略,往往采用 ( )策略。 A死锁的防止 B.死锁的避免 c.死锁的检测 D.死锁的防止、避免和检测的混合(一)单项选择题 1.D 2.C 3.B 4.D 5.A 6 C 7 D (二)填空题 l若系统中存在一种进程,它们中的每一个进程都占有了某种资源而又都在等待其中另一个进程所占用的资源。这种等待永远不能结束,则说明出现了______。 2.如果操作系统对 ______或没有顾及进程______可能出现的情况,则就可能形成死锁。3.系统出现死锁的四个必要条件是:互斥使用资源,______,不可抢夺资源和______。 4.如果进程申请一个某类资源时,可以把该类资源中的任意一个空闲资源分配给进程,则说该类资源中的所有资源是______。 5.如果资源分配图中无环路,则系统中______发生。 6.为了防止死锁的发生,只要采用分配策略使四个必要条件中的______。 7.使占有并等待资源的条件不成立而防止死锁常用两种方法:______和______. 8静态分配资源也称______,要求每—个进程在______就申请它需要的全部资源。 9.释放已占资源的分配策略是仅当进程______时才允许它去申请资源。 10抢夺式分配资源约定,如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足必须等待时、系统可以______该进程已占有的资源。 11.目前抢夺式的分配策略只适用于______和______。 12.对资源采用______的策略可以使循环等待资源的条件不成立。 13.如果操作系统能保证所有的进程在有限的时间内得到需要的全部资源,则称系统处于______。 14.只要能保持系统处于安全状态就可______的发生。 15.______是一种古典的安全状态测试方法。 16.要实现______,只要当进程提出资源申请时,系统动态测试资源分配情况,仅当能确保系统安全时才把资源分配给进程。 17.可以证明,M个同类资源被n个进程共享时,只要不等式______成立,则系统一定不会发生死锁,其中x为每个进程申请该类资源的最大量。 18.______对资源的分配不加限制,只要有剩余的资源,就可把资源分配给申请者。 19.死锁检测方法要解决两个问题,一是______是否出现了死锁,二是当有死锁发生时怎样去______。 20.对每个资源类中只有一个资源的死锁检测程序根据______和______两张表中记录的资源情况,把进程等待资源的关系在矩阵中表示出

如何对行 表 数据库加锁

如何对行表数据库加锁 1如何锁一个表的某一行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT*FROM table ROWLOCK WHERE id =1 2锁定数据库的一个表 SELECT*FROM table WITH (HOLDLOCK) 加锁语句: sybase: update表set col1=col1 where1=0 ; MSSQL: select col1 from表(tablockx) where1=0 ; oracle: LOCK TABLE表IN EXCLUSIVE MODE ; 加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁 几个例子帮助大家加深印象 设table1(A,B,C) A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 1)排它锁 新建两个连接 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30'--等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select*from table1 where B='b2' commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒 2)共享锁 在第一个连接中执行以下语句 begin tran select*from table1 holdlock-holdlock人为加锁 where B='b2' waitfor delay '00:00:30'--等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select A,C from table1 where B='b2' update table1 set A='aa' where B='b2' commit tran 若同时执行上述两个语句,则第二个连接中的select查询可以执行 而update必须等待第一个事务释放共享锁转为排它锁后才能执行即要等待30秒 3)死锁 增设table2(D,E) D E d1 e1 d2 e2 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30' update table2 set D='d5' where E='e1' commit tran 在第二个连接中执行以下语句 begin tran update table2 set D='d5' where E='e1'

李建伟版实用操作系统第二版最新习题 3 进程同步与通信

李建伟版实用操作系统第二版最新习题 3 进程同步与通信 一、选择题 题号1 2 3 4 5 6 7 8 9 10 答案A D D C B C A B A A 题号11 12 答案D C 二、综合题 1、答:临界资源也称独占资源、互斥资源,它是指某段时间内只充许一个进程使用的资源。比如打印机等硬件资源,以及只能互斥使用的变量、表格、队列等软件资源。各个进程中访问临界资源的、必须互斥执行的程序代码段称为临界区,各进程中访问同一临界资源的程序代码段必须互斥执行。 为防止两个进程同时进入临界区,可采用软件解决方法或同步机构来协调它们。但是,不论是软件算法还是同步机构都应遵循下述准则: ①空闲让进。②忙则等待。③有限等待。④让权等待。 2、答:忙等待意味着一个进程正在等待满足一个没有闲置处理器的严格循环的条件。因为只有一个CPU 为多个进程服务,因此这种等待浪费了CPU 的时钟。 其他类型的等待:与忙等待需要占用处理器不同,另外一种等待则允许放弃处理器。如进程阻塞自己并且等待在合适的时间被唤醒。忙等可以采用更为有效的办法来避免。例如:执行请求(类似于中断)机制以及PV 信号量机制,均可避免“忙等待”现象的发生。 3、答: 在生产者—消费者问题中,Producer 进程中P(empty)和P(mutex)互换先后次序。先 执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer 阻塞在信号量empty 上,而此时mutex 已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer 进程执行P(full)成功,但其执行P(mutex)时由于Producer 正在访问缓冲区,所以不成功,阻塞在信号量mutex 上。生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。 在生产者和消费者进程中,V 操作的次序无关紧要,不会出现死锁现象。 4、答:

数据库死锁的解决办法

Posts - 31 Articles - 0 Comments - 817 数据库死锁的解决办法 近日在博客网站上,回复别人的数据库死锁避免问题,之前也曾经几次答复过同样的内容,觉得很有必要汇聚成一个博客文章,方便大家。 这里的办法,对所有的数据库都适用。 这个解决办法步骤如下: 1. 每个表中加updated_count (integer) 字段 2. 新增一行数据,updated_count =0 : insert into table_x (f1,f2,...,update_count) values(...,0); 3. 根据主键获取一行数据SQL,封装成一个DAO 函数(我的习惯是每个表一个uuid 字段做主键。从不用组合主键,组合主键在多表join 时SQL 写起来很麻烦;也不用用户录入的业务数据做主键,因为凡是用户录入的数据都可能错误,然后要更改,不适合做主键)。 select * from table_x where pk = ? 4. 删除一行数据 4.1 先通过主键获取此行数据, 见3. 4.2 delete from table_x where pk = ? and update_count=? , 这里where 中的update_count 通过4.1 中获取 4.3 检查4.2 执行影响数据行数,如果删除失败,则是别人已经删除或者更新过同一行数据,抛异常,在最外面rollback,并通过合适的词语提醒用户有并发操作,请稍候再试。 int count = cmd.ExecuteNonQuery(); if(udpatedCount < 1){ throw new Exception(“检测到并发操作,为防止死锁,已放弃当前操作,请稍候再试,表xxx, 数据key ….”); } 5. 更新一行数据 5.1 先通过主键获取此行数据, 见3. 5.2 update table_x set f1=?,f2=?, ...,update_count=update_count+1 where pk = ? and updat e_count=? , 这里where 中的update_count 通过5.1 中获取 5.3 检查5.2 执行影响数据行数,如果更新失败,则是别人已经删除或者更新过同一行数据,抛异常,在最外面rollback,并通过合适的词语提醒用户有并发操作,请稍候再试。 int count = cmd.ExecuteNonQuery(); if(udpatedCount < 1){ throw new Exception(“检测到并发操作,为防止死锁,已放弃当前操作,请稍候再试,表xxx, 数据

操作系统(死锁)试题

第五章死锁 一.选择题 1.为多道程序提供的可共享资源不足时,可能出现死锁。但是,不适当的 C 也可能产生死锁。 (A)进程优先权(B)资源的线性分配 (C)进程推进顺序(D)分配队列优先权 2.采用资源剥夺法可以解除死锁,还可以采用 B 方法解除死锁。 (A)执行并行操作(B)撤销进程 (C)拒绝分配新资源(D)修改信号量 3.产生死锁的四个必要条件是:互斥、 B 循环等待和不剥夺。 (A)请求与阻塞(B)请求与保持 (C)请求与释放(D)释放与阻塞 4.在分时操作系统中,进程调度经常采用算法。 (A)先来先服务(B)最高优先权 (C)时间片轮转(D)随机 5.资源的按序分配策略可以破坏条件。 (A)互斥使用资源(B)占有且等待资源 (C)非抢夺资源(D)循环等待资源 6.在 C 情况下,系统出现死锁。 (A)计算机系统发生了重大故障 (B)有多个封锁的进程同时存在 (C)若干进程因竞争而无休止地相互等待他方释放已占有的资源 (D)资源数远远小于进程数或进程同时申请的资源数量远远超过资源总数 7。银行家算法在解决死锁问题中是用于 B 的。 (A)预防死锁(B)避免死锁 (C)检测死锁(D)解除死锁 8.支持多道程序设计的操作系统在运行过程中,不断地选择新进程运行来实现CPU的共享,但其中不是引起操作系统选择新进程的直接原因。 (A)运行进程的时间片用完 (B)运行进程出错 (C)运行进程要等待某一事件发生 (D)有新进程进入就绪队列 9. 在下列解决死锁的方法中,属于死锁预防策略的是 B 。 (A)银行家算法 (B)有序资源分配法 (C)死锁检测法 (D)资源分配图化简法 二、综合题 1.若系统运行中出现如表所示的资源分配情况,改系统是否安全?如果进程P2此时提出资源申请(1,2,2,2),系统能否将资源分配给它?为什么?

数据库解除死锁方法

先查看哪些表被锁住了: 杀进程中的会话: 如果有ora-00031错误,则在后面加immediate;alter system kill session '29,5497' immediate; 如何杀死oracle死锁进程

1.查哪个过程被锁: 查V$DB_OBJECT_CACHE视图: SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0'; 2. 查是哪一个SID,通过SID可知道是哪个SESSION: 查V$ACCESS视图: SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名'; 3. 查出SID和SERIAL#: 查V$SESSION视图: SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'; 查V$PROCESS视图: SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR'; 4. 杀进程: (1)先杀ORACLE进程: ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#'; (2)再杀操作系统进程: KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。 Oracle的死锁 查询数据库死锁:

查询出来的结果就是有死锁的session了,下面就是杀掉,拿到上面查询出来的SID和SERIAL#,填入到下面的语句中: alter system kill session 'sid,serial#'; 一般情况可以解决数据库存在的死锁了,或通过session id 查到对应的操作系统进程,在Unix中杀掉操作系统的进程。 然后采用kill (unix)或orakill(windows )。 在Unix中: 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。 1)查找死锁的进程: 2)kill掉这个死锁的进程: alter system kill session ‘sid,serial#’; (其中sid=l.session_id) 3)如果还不能解决:

进程同步与互斥练习

进程同步与互斥 练习题 选择题 .任何两个并发进程之间存在着()地关系. .各自完全独立 .拥有共享变量 .必须互斥 .可能相互制约文档收集自网络,仅用于个人学习 .并发进程执行地相对速度是(). .由进程地程序结构决定地 .由进程自己来控制地 .在进程被创建时确定地 .与进程调度策略有关地文档收集自网络,仅用于个人学习 .并发进程执行时可能会出现“与时间有关地错误”,这种错误是由于并发进程()引起地. .使用共享资源 .执行地顺序性 .要求计算时间地长短 .程序地长度文档收集自网络,仅用于个人学习 .并发进程中与共享变量有关地程序段称为(). .共享子程序 .临界区 .管理区 .公共数据区文档收集自网络,仅用于个人学习 .用来实现进程同步与互斥地操作实际上是由()过程组成地. .一个可被中断地 .一个不可被中断地 .两个可被中断地 . 两个不可被中断地文档收集自网络,仅用于个人学习 .进程从运行态变为等待态可能由于(). .执行了操作 .执行了操作 .时间片用完 .有高优先级进程就绪文档收集自网络,仅用于个人学习 .用操作管理互斥使用地资源时,信号量地初值应定义为(). .任意正整数 . . .文档收集自网络,仅用于个人学习 .用、操作管理临界区时,互斥信号量地初值应定义为( ). .任意值 . . . .现有个具有相关临界区地并发进程,如果某进程调用操作后变为等待状态,则调用操作时

信号量地值必定为(). .≤ . . .文档收集自网络,仅用于个人学习 .用操作管理临界区时把信号量地初值定义为,现已有一个进程在临界区,但有个进程在等待进人临界区,这时信号量地值为(). . . . .文档收集自网络,仅用于个人学习 .用操作唤醒一个等待进程时,被唤醒进程地状态应变成()状态. .执行 .就绪 .运行 .收容文档收集自网络,仅用于个人学习 .进程间地同步是指进程间在逻辑上地相互( )关系. .联接.制约文档收集自网络,仅用于个人学习 .继续.调用 多项选择题 .有关并发进程地下列叙述中,()是正确地. .任何时刻允许多个进程在同一上运行 .进程执行地速度完全由进程自己控制 .并发进程在访问共享资源时可能出现与时间有关地错误 .同步是指并发进程中存在地一种制约关系 .各自独立地并发进程在执行时不会相互影响文档收集自网络,仅用于个人学习.一个正在运行地进程调用()后,若地值为(),则该进程可以继续运行. .> .< .≠ .≥ .≤ 文档收集自网络,仅用于个人学习 判断题 .有交往地并发进程一定共享某些资源. () .如果不能控制并发进程执行地相对速度,则它们在共享资源时一定会出现与时间有关地错误. () .并发进程地执行结果只取决于进程本身,不受外界影响. () .多道程序设计必然导致进程地并发执行. () 有个进程共享同一临界资源,若使用信号量机制实现对资源地互斥访问,则信号量值地变化范围是. 文档收集自网络,仅用于个人学习 对于两个并发进程,设互斥信号量为,若,则 表示没有进程进入临界区表示有一个进程进入临界区 表示有一个进程进入临界区,另一个进程等待进入 表示有两个进程进入临界区

相关文档
最新文档