数据库死锁分析

数据库死锁分析
数据库死锁分析

目录

1.对数据库设计的要求

2.对数据库开发的要求

3.对运行维护的要求

4.数据库开发中各种死锁剖析

4.1类型一:事务中SQL语句先后顺序不当造成死锁

4.2类型二:S YBASE数据库采用锁模式不当造成死锁

4.3类型三:DML语句影响行数过多造成死锁

数据库死锁

死锁是指在某组资源中,两个或两个以上的线程在执行过程中,在争夺某一资源时而造成互相等待的现象,若无外力的作用下,它们都将无法推进下去,死时就可能会产生死锁,这些永远在互相等待的进程称为死锁线程。简单地说,进程A等待进程B释放他的资源,B 又等待A释放他的资源,这样互相等待就形成死锁。

死锁在高并发环境中产生。

易引起数据库效率低,产生阻塞,甚至产生死锁。有会两种方法:在保证正确的前提下,事务越小越好;控制dml语句影响行数,行数越少越好。

说明:根据业务特点,将用到的表按照主次排序,在事务中,按照先主后次的顺序操作。

说明:优先对排他性较高的资源加锁,有利于提高系统并发性能。

3.对运行维护的要求

出现死锁后,数据库牺牲引起死锁的最早的事务,自动解开死锁。

定期的检查数据库日志,看日志是否报“dead lock”错。

4.数据库开发中各种死锁剖析

4.1类型一:事务中sql语句先后顺序不当造成死锁

●说明

代码中事务控制逻辑不当,引起死锁。

●举例

2009年02月16日,海外某局点Sybase数据库报告死锁。

04:00000:00231:2009/02/16 07:16:37.80 server Deadlock Id 40 detected

Deadlock Id 40: Process (Familyid 0, Spid 64, Suid 3) was executing a UPDATE command at line 1.

SQL Text: update tb_userlevel set usedlicense=usedlicense-1 where usertype=@p0?

Deadlock Id 40: Process (Familyid 0, Spid 231, Suid 3) was executing a UPDATE command at line 1.

SQL Text: update tb_userlevel set usedlicense=usedlicense-1 where usertype=@p0?

Deadlock Id 40: Process (Familyid 0, Spid 231) was waiting for a 'exclusive row' lock on row 4 page 552209 of the 'tb_userlevel' table in database 9 but process (Familyid 0, Spid 64) already held a 'exclusive row' lock on it.

Deadlock Id 40: Process (Familyid 0, Spid 64) was waiting for a 'exclusive row' lock on row 6 page 552209 of the 'tb_userlevel' table in database 9 but process (Familyid 0, Spid 231) already held a 'exclusive row' lock on it.

Deadlock Id 40: Process (Familyid 0, Spid 64) was chosen as the victim.

互锁的sql都是执行同一个update,即将tb_userlevel表某个等级的license减1,在代码中只有一个地方使用,即用户修改了自己的等级时更新新、旧等级的已使用license,具体代码逻辑是这样的(一个事务里):

1、将新等级的license加1;

2、将原等级的license减1;

当A用户由等级2-》等级1,而此时正好有B用户由等级1-》等级2时,上述代码实际就是这样的事务sql:

用户A:

begin tran

update tb_userlevel set usedlicense=usedlicense+1 where usertype=1 -------(1) update tb_userlevel set usedlicense=usedlicense-1 where usertype=2 -------(2)

commit

用户B:

begin tran

update tb_userlevel set usedlicense=usedlicense+1 where usertype=2 -------(3) update tb_userlevel set usedlicense=usedlicense-1 where usertype=1 -------(4) commit

数据库采用行锁模式。先执行(1),则A将tb_userlevel某一行锁住,这时如果先执行(3),则B将tb_userlevel另一行锁住,那么,不管是再执行(2)还是(4),都会死锁了。

●解决办法

这中类型死锁解决办法是:事务控制逻辑中保证两个session对资源的锁定先后顺序一致。

4.2类型二:Sybase数据库采用锁模式不当造成死锁

●说明

Sybase通常采用两个锁模式,表锁和行锁,采用表锁并发性能较差,容易造成死锁。

●举例

2009年04月17日,某局点Sybase数据库报告死锁。

00:00000:00045:2009/04/17 16:15:07.70 server Deadlock Id 69 detected

Deadlock Id 69: Process (Familyid 0, Spid 160, Suid 1) was executing a INSERT command at line 1.

SQL Text: insert into send_info_phone (send_info_id,desttermid,content) values( @P0 , @P1 , @P2 )?

Deadlock Id 69: Process (Familyid 0, Spid 45, Suid 1) was executing a DELETE command at line 1.

SQL Text: delete from send_info_phone where send_info_id = 953461

Deadlock Id 69: Process (Familyid 0, Spid 45) was waiting for a 'update page' lock on page 88544 of the 'send_info_phone' table in database 37 but process (Familyid 0, Spid 160) already held a 'exclusive page' lock on it.

Deadlock Id 69: Process (Familyid 0, Spid 160) was waiting for a 'exclusive page' lock on page 88464 of the 'send_info_phone' table in database 37 but process (Familyid 0, Spid 45) already held a 'update page' lock on it.

Deadlock Id 69: Process (Familyid 0, Spid 160) was chosen as the victim. End of deadlock information.

某个session往表中插入数据的同时,另外一个session又在删除,由于锁定的数据块包括多行数据,两个session出现死锁。

●解决办法

在这种情况下,将表的锁模式修改为行锁即可。

4.3类型三:DML语句影响行数过多造成死锁

●说明

数据操纵语句(Data Manipulation Language, DML)包括update、insert和delete。

执行DML语句采用排它锁,如果影响行数过多,可能造成死锁。

●举例

表结构:

Create table test(id int,revid int,name varchar2(10));

索引:

Create unique index idxtestid on test(id);

Create unique index idxtestrevid on test(revid);

数据有100万条,id与revid大小呈递减关系。

Insert into test select rownum, 1000000-rownum,’’ from all_objects where rownum<1000000;

会话A执行

Delete from test where id>0;

会话B执行:

Delete from test where revid>0;

以上两个会话同时执行,Oracle数据库报告死锁。

*** SESSION ID:(13.11) 2009-05-04 15:09:09.000 DEADLOCK DETECTED

Current SQL statement for this session:Delete from test where id>0

Deadlock graph:

---------Blocker(s)-------- ---------Waiter(s)--------- Resource Name process session holds waits process session holds waits TX-00040028-0000268c 13 13 X 12 9 X TX-00020027-00002da1 12 9 X 13 13 X session 13: DID 0001-000D-00000002 session 9: DID 0001-000C-00000002

session 9: DID 0001-000C-00000002 session 13: DID 0001-000D-00000002

Rows waited on:

Session 9: obj - rowid = 0000795E - AAAHljAALAAB9FyAGd

(dictionary objn - 31070, file - 11, block - 512370, slot - 413)

Session 13: obj - rowid = 0000795E - AAAHljAALAAB9FyAGe

(dictionary objn - 31070, file - 11, block - 512370, slot - 414)

Information on the OTHER waiting sessions:

Session 9:

pid=12 serial=88 audsid=596 user: 59/ZXIN

Current SQL Statement: Delete from test where revid>0

两个session都同时锁定多行数据,锁定数据行的先后顺序相反,造成死锁。

●解决办法

解决这种类型的死锁方法是:将事务做成小事务,使每个sql语句影响的行数较小。

数据库死锁问题总结

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

“走进数据库”的教学案例[1]

第二节走进数据库教学案例 【教材、学情分析】 学生虽然对信息技术学科充满兴趣,但在学习信息技术课程中,对许多概念知识感到很抽象,很难理解。比如本节,中国地图出版社出版的高中信息教材第三单元《科学管理信息》中的第二节《走进数据库》的学习牵扯的概念比较多,学起来比较枯燥;其中的第一节课ACCESS数据库的引入比较关键,起到承前启后的作用,因为学生学习过EXCEL,在头脑里有EXCEL先入为主,所以容易混淆数据库与EXCEL的概念。 数据库第一节课的学习内容要求学生了解用数据库管理信息的优势,熟悉Access数据库管理系统,对access数据库管理系统有个感性的认识。笔者在教学中思考:怎样才能巧妙地引入以达到很好地过渡与理解二者的学习呢? 【教学策略】 通过比较选择,使用了科学出版社出版的教材中所附的光盘素材,即以网站形式呈现的“选修课程信息管理系统”,使用起来比较方便而且贴近学生;并在教学中多处创设情景、设置疑问来激发学生的学习欲望,分清数据库与EXCEL的不同,了解数据库管理信息的优势。 【教学目标】 1、知识与技能: 体验了解数据库管理信息的优势,对ACCESS数据库有个感性的认识。 2、过程与方法: 通过对数据库的剖析,了解使用数据库管理信息的基本思想与方法。 在问题探讨中养成思考与探索的习惯。 3、情感态度与价值观: 在科学管理信息的过程中,体现有效管理数据的重要性,形成科学管理信息的意识,培养学生的科学素养。 【教学重点】了解数据库管理信息的优势 【教学难点】了解数据库管理信息的优势 【教学方法】情景教学法、任务驱动教学法。

【教学准备】 1、机房内上课。机房多媒体广播软件的使用,教师的操作可以广播给学生观看。 2、将选修课程的ASP网站即“选修课程信息管理系统”发布到机房服务器上;并将该网站文件夹设置共享;在该课程管理系统中设置好高二的选修课程。机房服务器中设置FTP文件传输,使可以文件上传。 3、某届高一年级学生信息技术五门选修课程的EXCEL选修情况表。 【教学过程】 教师创设情况一(EXCEL复习): [教师] 下学期即将进入选修课程的学习,选修课程有五门:《多媒体技术应用》、《算法与程序设计》、《人工智能初步》、《网络技术应用》、《数据管理技术》。教师展示某届高一年级学生信息技术五门选修课程的EXCEL选修情况表。 [教师] 如果想知道有哪些学生选择了《算法与程序设计》该怎么办? 有哪些学生同时选择了《算法与程序设计》和《多媒体技术应用》? [学生] 通过筛选来操作。 学生操作演示:请学生到讲台操作筛选并通过广播软件将操作展示给其他同学; 然后教师再讲解。 教师设计情景二: [教师] 这个表是老师假设的。如果要每个同学自己来选的话,有什么办法?亦即现在学校要统计每门课程每个班有多少学生选,一般会怎样来操作? [学生] 让学生写小纸条交给班主任进行统计。 [教师] 可是每个班这样操作之后,还要全年级进行再一次的统计,操作比较繁琐,有没有什么好的方法呢。 [学生1] 用电脑来完成。 [教师] 用电脑怎么操作呢? [学生2] 用EXCEL操作。

实验三死锁的检测和解除

南华大学计算机科学与技术学院 实验报告 课程名称操作系统I 姓名 学号 专业班级 任课教师 日期

一、实验内容 死锁的检测与解除 二、实验目的 掌握操作系统的进程管理与资源分配原理,掌握对操作系统安全性检验和死锁的解除的原理和方法。 三、实验题目 系统中有m 个同类资源被n 个进程共享,每个进程对资源的最大需求数分别为S1,S2,…,Sn,且Max(Si)<=m, (i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,实现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。 分别使用检测“进程—资源循环等待链”的方法和Coffman 的算法来检测进程的死锁状态。对于相同的进程资源分配、占用次序,比较两个算法的结果。 四、设计思路和流程图 1.输入系统进程数量n和资源类型数量m。 2.输入每类资源的数量。 3.输入每个进程每类资源的最大需求量和已获资源量。 4.检验系统的安全。 5.若检测结果为系统不安全,可以对死锁进行解除,直到安全为 止再检测。 6.重复5操作,直到所有进程运行完毕。

五、主要数据结构及其说明 int Max[100][100]={0}; //各进程所需各类资源的最大需求; int Available[100]={0}; //系统可用资源; char Name[100]={0}; //资源的名称; int Allocation[100][100]={0}; //系统已分配资源; int Need[100][100]={0}; //还需要资源 int Request[100]={0}; //请求资源向量; int Temp[100]={0}; //存放安全序列; int Work[100]={0}; //存放系统可提供资源; bool Finish[100]={0};//存放已完成的序列 六、源程序并附上注释 #include "stdafx.h" #include #define False 0 #define True 1 using namespace std; int Max[100][100]={0}; //各进程所需各类资源的最大需求; int Available[100]={0}; //系统可用资源; char Name[100]={0}; //资源的名称; int Allocation[100][100]={0}; //系统已分配资源; int Need[100][100]={0}; //还需要资源 int Request[100]={0}; //请求资源向量; int Temp[100]={0}; //存放安全序列; int Work[100]={0}; //存放系统可提供资源; bool Finish[100]={0}; int M=100; //作业的最大数 int N=100; //资源的最大数 int l=0;//记录安全进程的TEMP下标 void ShowData()//初始化资源矩阵

校园基础地理空间数据库建设设计方案

校园基础地理空间数据库建设设计方案 遥感1503班第10组 (杨森泉张晨欣杨剑钢熊倩倩) 测绘地理信息技术专业 昆明冶金高等专科学校测绘学院 2017年5月

一.数据来源 二. 目的 三 .任务 四. 任务范围 五 .任务分配与计划六.小组任务分配七. E-R模型设计八.关系模式九.属性结构表十.编码方案

一.数据来源 原始数据为大二上学期期末实训数字测图成果(即DWG格式的校园地形图) 导入GIS 软件数据则为修改过的校园地形图 二.目的 把现实世界中有一定范围内存在着的应用数据抽象成一个数据库的具体结构的过程。空间数据库设计要满足用户需求,具有良好的数据库性能,准确模拟现实世界,能够被某个数据库管理系统接受。

三.任务 任务包括三个方面:数据结构、数据操作、完整性约束 具体为: ①静态特征设计——结构特性,包括概念结构设计和逻辑结构设计; ②动态特性设计——数据库的行为特性,设计查询、静态事务处理等应用程序; ③物理设计,设计数据库的存储模式和存储方式。 主要步骤:需求分析→概念设计→逻辑设计→物理设计 原则:①尽量减少空间数据存储冗余;②提供稳定的空间数据结构,在用户的需要改变时,数据结构能够做出相应的变化;③满足用户对空间数据及时访问的需求,高校提供用户所需的空间数据查询结果;④在空间元素间为耻复杂的联系,反应空间数据的复杂性;⑤支持多种决策需要,具有较强的应用适应性。 四、任务范围 空间数据库实现的步骤、建库的前期准备工作内容、建库流程 步骤:①建立实际的空间数据库结构;②装入试验性数据测试应用程序;③装入实际空间数据,建立实际运行的空间数据库。 前期准备工作内容:①数据源的选择;②数据采集存储原则;③建库的数据准备;④数据库入库的组织管理。 建库流程:①首先必须确定数字化的方法及工具;②准备数字化原图,并掌握该图的投影、比例尺、网格等空间信息;③按照分层要求进行

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项。在业务分析的基础上,应该画出系统的数据流图。整个系统的分层数据流图将揭示一个系统内全部的数据项、数据结构、数据存储以及对数据的加工处理功能。在此基础上就可以建立系统的数据字典。本书不讨论数据流图和完整的数据字典规范等内容,仅对最后建立数据库所需要的数据进行分析说明。 在上述4项业务中涉及到的业务数据包括:进书数据、库存数据、销售数据。在这些数据中又涉及到图书数据、员工数据等,而图书数据与出版社有关,员工与部门有关。 因此,将所有数据进行归类分析,书店销售管理信息系统要处理的数据应该包括:

第三章习题(处理机调度与死锁)

一、单项选择题 1.在为多道程序所提供的可共享的系统资源不足时,可能出现死锁。但是,不适当的 c 也可能产生死锁。 A.进程优先权 B.资源的线性分配 C.进程推进顺序 D. 分配队列优先权 2.采用资源剥夺法可解除死锁,还可以采用 b 方法解除死锁。 A.执行并行操作 B.撤消进程 C.拒绝分配新资源 D.修改信号量 3.产生死锁的四个必要条件是:互斥、 b 、循环等待和不剥夺。 A. 请求与阻塞 B.请求与保持 C. 请求与释放 D.释放与阻塞 4.发生死锁的必要条件有四个,要防止死锁的发生,可以破坏这四个必要条件,但破坏 a 条件是不太实际的。 A. 互斥 B.不可抢占 C. 部分分配 D.循环等待 5.在分时操作系统中,进程调度经常采用 c 算法。 A.先来先服务 B.最高优先权 C.时间片轮转 D.随机 6.资源的按序分配策略可以破坏 D 条件。 A. 互斥使用资源 B.占有且等待资源 C.非抢夺资源 D. 循环等待资源 7.在 C 的情况下,系统出现死锁。 A. 计算机系统发生了重大故障 B.有多个封锁的进程同时存在 C.若干进程因竞争资源而无休止地相互等待他方释放已占有的资源 D.资源数大大小于进程数或进程同时申请的资源数大大超过资源总数 8.银行家算法是一种 B 算法。 A.死锁解除 B.死锁避免 C.死锁预防 D. 死锁检测 9.当进程数大于资源数时,进程竞争资源 B 会产生死锁。 A.一定 B.不一定 10. B 优先权是在创建进程时确定的,确定之后在整个进程运行期间不再改变。 A.先来先服务 B.静态 C.动态 D.短作业 11. 某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是 B A.9 B.10 C.11 D.12 答:B 13.当检测出发生死锁时,可以通过撤消一个进程解除死锁。上述描述是 B 。 A. 正确的 B.错误的 14.在下列解决死锁的方法中,属于死锁预防策略的是 B 。 A. 银行家算法 B. 资源有序分配法 C.死锁检测法 D.资源分配图化简法 15.以下叙述中正确的是 B 。 A. 调度原语主要是按照一定的算法,从阻塞队列中选择一个进程,将处理机分配 给它。 B.预防死锁的发生可以通过破坏产生死锁的四个必要条件之一来实现,但破坏互斥条件的可能性不大。 C.进程进入临界区时要执行开锁原语。 D.既考虑作业等待时间,又考虑作业执行时间的调度算法是先来先服务算法。

死锁问题解决方法

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参数,这样会初始化表空间,造成数据完全丢失且无法挽回。

无锡市基础空间数据库SHP格式方案(大比例尺)

无锡市基础空间数据SHP格式设计方案 (大比例尺) 1、综述 1.1目的 为无锡市规划局基础空间数据建库提供标准。 1.2适用范围 1:500、1:1000、1:2000基础地形图数据 1.3制定原则 ●保证按本方案生产的数据可以实现同SHP数据的高效互转; ●保证按本方案生产的数据在转入数据库后可以实现标准图的输出; ●操作方便。 1.4类型约定 ● ●

1.5引用标准 《GB/T 14804-93 1:500 1:1000 1:2000 地形图要素分类与代码》(1994-08-01)《GB/T 7929-1995 1:500 1:1000 1:2000 地形图图式》(1996-05-01) 《GB 1:500 1:1000 1:2000 地形图数字化规范》(1998-08-01) 《GB/T14804-93 1:500 1:1000 1:2000 地形图要素分类与代码》(1994-08-01)《GT地籍数据库标准》 《GB/T 13923-92 国土基础信息数据分类与代码》(1993-07-01) 2、实体的划分 数据在SDE的服务器里是按照点、线、面和注记划分的,每一个SDE图层(FEATURECLASS)只能存储上述的一种空间对象。由于这种存储模型的限制,势必造成很多国标中的复杂地物被拆分到不同的SDE图层。为了在编码中体现设计的合理性、对实体的物理存储进行统一的管理,特在数据库的设计中在对空间实体做逻辑的划分。 2.1简单点 ●简单点实体只记录插入点的位置和相关属性,所有的简单点实体都必须以插入符号 的形式采集。 ●简单点状实体对应ARCOBJECT体系的IPOINT对象。 ●采集单位在使用点符号的时候要保证简单点的符号要和本方案提供的符号描述一 致,符号的插入点一致。 2.2简单无向线 ●简单线需要作业单位针对每一种实体制作线符号,这里所指的线符号必须是采集系 统提供的线符号库,不能用程序绘制。

数据库锁表与解锁

数据库锁表与解锁 一、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

SQL_Server数据库设计的案例分析报告

数据库设计的案例分析 一、教学管理 1. 基本需求 某学校设计学生教学管理系统。学生实体包括学号、、性别、生日、民族、籍贯、简历、登记照,每名学生选择一个主修专业,专业包括专业编号和名称,一个专业属于一个学院,一个学院可以有若干个专业。学院信息要存储学院号、学院名、院长。教学管理还要管理课程表和学生成绩。课程表包括课程号、课程名、学分,每门课程由一个学院开设。学生选修的每门课程获得一个成绩。 设计该教学管理的ER模型,然后转化为关系模型。 若上面的管理系统还要管理教师教学安排,教师包括编号、、年龄、职称,一个教师只能属于一个学院,一名教师可以上若干门课程,一门课程可以有多名老师来上,每个教师所上的每门课都有一个课堂号和课时数。试修改上题的ER 模型,将教师教学信息管理增加进去。

2. 参考设计: 图一教学管理ER图 由ER模型转换的关系模型是: 学生(学号,,性别,生日,民族,籍贯,专业号,简历,登记照) 专业(专业号,专业,专业类别,学院号) 学院(学院号,学院,院长) 课程(课程号,课程名,学分,学院号) 成绩(学号,课程号,成绩) (题目分析:本题中有学生、专业、学院、课程四个实体。一个学生只有一个主修专业,学生与专业有多对一的联系;一个专业只由一个学院开设,一门课程只由一个学院开设,学院与专业、学院与课程都是一对多的联系;学生与课程有多对多的联系。 在转换为关系模型时,一对多的联系都在相应的多方实体的关系中增加一个外键。) 增加教师,ER图如下。

图二有教师实体的教学管理ER图 3. 物理设计 基于Access的数据库结构设计如下。 指定数据库文件的名称,并为设计好的关系模型设计表结构。 数据库文件保存在“E:\教学管理\”文件夹中,数据库文件名:教学管理.MDB。 表包括:学院、专业、学生、课程、成绩单。对应表结构如表1-2至表1-6所示。 表1-1 学院 字段名类型宽度小数主键/索 引参照表约束Null 值 学院号文本型 2 ↑(主) 学院文本型16 院长文本型8 √ 表1-2 专业 字段名类型宽度小数主键/索 引参照表约束Null 值 专业号文本型 4 ↑(主) 专业文本型16 专业类别文本型8 ↑ 学院号文本型 2 学院 表1-3 学生 字段名类型宽度小数主键/索参照表约束Null

如何对行 表 数据库加锁

如何对行表数据库加锁 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'

数据库案例分析与设计

数据库案例分析与设计考核题 1203批次前老平台学生,该门课程不用现场笔试考试(网上预约考试时间为虚设),请预约该门课程考试的学生将答案手写A4答题纸上,于规定时间内交到学习中心,哈站交到班主任处。未预约的学生提交的内容作废处理,预约后不按规定时间提交按旷考处理。 (答题纸附在第二页,所有答案必须写在答题纸上,标清题号) 一.设计报告的题目要求 在以下三个题目中选择一个,作为数据库应用系统设计的内容,进行必要的走访和调研完成你的设计报告。 1.人事信息管理系统 调研一个中等规模的机构或单位,完成该单位的人事信息管理系统的设计工作。以满足基本的人事管理功能:比如员工的基本信息管理,如编号、姓名、性别、学历、所属部门、毕业院校、健康情况、职称、职务、奖惩等;员工各种信息的修改;对转出、辞退、退休员工信息的删除;按照一定条件,查询、统计符合条件的员工信息;人事的调动任免信息的管理;按条件查询、统计,结果打印输出等。 2.超市会员管理系统 调研一个具有会员管理功能的商场或超市等,完成该单位的基本会员信息管理系统的设计。比如加入会员的基本信息,包括:会员的基本条件、优惠政策、优惠时间等。会员的基本信息,包括姓名、性别、年龄、工作单位、联系方式等。会员购物信息:购买物品编号、物品名称、所属种类,数量,价格等。会员返利信息,包括会员积分的情况,享受优惠的等级等。对货物流量及消费人群进行统计输出等。 3.客房管理系统 调研一个中等规模的宾馆,完成该宾馆的客房管理信息系统的设计。实现客房管理的基本功能,包括客房的类别、当前的状态、负责人等;客房信息的查询和修改,包括按房间号查询住宿情况、按客户信息查询房间状态等。以及退房、订房、换房等信息的修改等。 二.设计报告的内容要求 给出数据库系统的6个设计阶段的主要工作内容,其中(1)-(4)必做,(5)-(6)选做: (1)需求分析:收集并分析用户的基本要求,简要概述系统的设计目标;详细描述用户 对数据库的要求,明确用户需求;给出主要的用户活动图、数据流图和数据字典等。 (2)概念结构设计:对具体应用建模,给出数据间的关系模型;利用需求分析得到的数 据内容等给出主要的实体关系图(E-R图),并详细描述实体和关系的属性等。 (3)逻辑结构设计:得到具体的关系模式集,并适当优化;利用得到的E-R图,转换为 具体的关系结构,并标明相互关联和各自的主键等具体内容;采用水平分解或垂直分解等方法,进行适当的优化。 (4)物理结构设计:选用一种DBMS,利用SQL语句给出数据库内模式的设计等;根据 得到的关系结构和选用的DBMS,进行关系构建具体的SQL语句,确定文件的存储方式、表的索引方式等。 (5)数据库实施:前端应用程序的设计等。 (6)数据库运行和维护:数据库的测试及运行过程。

死锁的检测与解除C语言代码

实验名称:死锁的检测与解除姓名:杨秀龙 学号:1107300432 专业班级:创新实验班111 指导老师:霍林

实验题目 死锁的检测与解除 实验目的 为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁 设计思想 首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。 主要数据结构 和银行家算法类似,需要建立相应的数组 int allocation[M][M]; int request[M][M]; int available[M]; int line[M]; //管理不占用资源的进程 int no[M]; //记录造成死锁的进程 int work[M];

流程图 否

运行结果 图(1)不会发生死锁时 图(1)当发生死锁时

附录 源代码如下: # include "stdio.h" # define M 50 int allocation[M][M]; int request[M][M]; int available[M]; int line[M]; int no[M]; intn,m,i,j,f,a=0; main() { void check(); void remove(); void show(); printf("输入进程总数:"); scanf("%d", &n); printf("输入资源种类数量:"); scanf("%d", &m); printf("输入进程已占用的资源Allocation:\n"); for(i=0;i

数据库解除死锁方法

先查看哪些表被锁住了: 杀进程中的会话: 如果有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)如果还不能解决:

数据库设计实例需求分析、概念结构、逻辑结构

数据库设计实例分析 一、需求分析实例 现要开发高校图书管理系统。经过可行性分析和初步的需求调查,确定了系统的功能边界,该系统应能完成下面的功能: (1)读者注册。 (2)读者借书。 (3)读者还书。 (4)图书查询。 1、数据流图 顶层数据流图反映了图书管理系统与外界的接口,但未表明数据的加工要求,需要进一步细化。根据前面图书管理系统功能边界的确定,再对图书管理系统顶层数据流图中的处理功能做进一步分解,可分解为读者注册、借书、还书和查询四个子功能,这样就得到了图书管理系统的第0层数据流图 从图书管理系统第0层数据流图中可以看出,在图书管理的不同业务中,借书、还书、查询这几个处理较为复杂,使用到不同的数据较多,因此有必要对其进行更深层次的分析,即构建这些处理的第1层数据流图。下面的图8-7分别给出了借书、还书、查询子功能的第1层数据流图 2、数据字典 数据项 数据项名称:借书证号 别名:卡号 含义说明:惟一标识一个借书证 类型:字符型 长度:20 …… 数据结构 (1)名称:读者类别 含义说明:定义了一个读者类别的有关信息 组成结构:类别代码+类别名称+可借阅数量+借阅天数+超期罚款额 (2)名称:读者 含义说明:定义了一个读者的有关信息 组成结构:姓名+性别+所在部门+读者类型 (3)名称:图书 含义说明:定义了一本图书的有关信息 组成结构:图书编号+图书名称+作者+出版社+价格 ……

数据流 (1)数据流名称:借书单 含义:读者借书时填写的单据 来源:读者 去向:审核借书 数据流量:250份/天 组成:借书证编号+借阅日期+图书编号 (2)数据流名称:还书单 含义:读者还书时填写的单据 来源:读者 去向:审核还书 数据流量:250份/天 组成:借书证编号+还书日期+图书编号 …… 数据存储 (1)数据存储名称:图书信息表 含义说明:存放图书有关信息 组成结构:图书+库存数量 说明:数量用来说明图书在仓库中的存放数 (2)数据存储名称:读者信息表 含义说明:存放读者的注册信息 组成结构:读者+卡号+卡状态+办卡日期 说明:卡状态是指借书证当前被锁定还是正常使用 (3)数据存储名称:借书记录 含义说明:存放读者的借书、还书信息 组成结构:卡号+书号+借书日期+还书日期 说明:要求能立即查询并修改 …… 处理过程 (1)处理过程名称:审核借书证 输入:借书证 输出:认定合格的借书证 加工逻辑:根据读者信息表和读者借书证,如果借书证在读者信息表中存在并且没有被锁定,那么借书证是有效的借书证,否则是无效的借书证。 …… 二、概念结构设计实例 1.标识图书管理系统中的实体和属性 参照数据字典中对数据存储的描述,可初步确定三个实体的属性为: 读者:{卡号,姓名,性别,部门,类别、办卡日期,卡状态} 读者类别:{类别代码,类别名称,可借阅天数、可借阅数量,超期罚款额}

相关文档
最新文档