死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交.本文介绍一种处理解决这种死锁的方法。
Sybase封锁原理
数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。并发控制的任务就是为了避免共享冲突而引起的数据不一致。Sybase SQL Server并发控制的方法是加锁机制(LOCKING).
锁的类型 可申请的锁
已有的锁 S U X
S ∨ ∨ ×
U ∨ × ×
X × × ×
Sybase SQL Server有三种封锁类型:排它锁(exclusive lock,简称X锁);共享锁(share lock,简称S锁);更新锁(update lock,简称U锁)。这三种锁的相容矩阵表如下:
×:表示不兼容。∨:表示兼容。 Sybase SQL Server是自动决定加锁类型的。一般来说,读(SELECT)操作使用S锁,写(UPDATE,INSERT和delete)操作使用X锁。U锁是建立在页级上的,它在一个更新操作开始时获得,当要修改这些页时,U锁会升级为X锁。
锁的力度
SQL Server有两级锁:页锁和表锁。通常页锁比表锁的限制更少(或更小)。页锁对本页的所有行进行锁定,而表锁则锁定整个表。为了减小用户间的数据争用和改进并发性,SQL Server试图尽可能地使用页锁。
当SQL Server决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。锁定策略直接受查询方案约束,如果update或delete语句没有可用的索引,它就执行表扫描或请求一个表锁定。如果update或delete语句使用了索引,它就通过请求页锁来开始,如果影响到大多数行,它就要请求表锁。一旦一个语句积累的页锁超过锁提升阈值,SQL Server就设法给该对象分配一个表锁。如果成功了,页锁就不再必要了,因此被释放。表锁也在页层提供避免锁冲突的方法。对于有些命令SQL Server自动使用表锁。
锁的状态
SQL SERVER加锁有三种状态:
1)意向锁(intend)—是一种表级锁,它表示在一个数据页上获得一个S或X锁的意向。意向锁可以防止其他事务在该数据页的表上获得排它锁。
2)阻塞(blocking,简记blk)—它表明目前加锁进程的状态,带有blk后缀的锁说明该进程目前正阻塞另一个需要获得锁的进程,只有这一进程完成,其他进程才可以进行。
3)需求锁(demand)—表示此时该进程企图得到一个排它锁。它可以防止在这一表或页上加过多的S锁,她表示某一事务是下一个去锁定该表和该页的事务。
需求锁是一个内部过程,因此用sp_lock是无法看见的。
死锁DEADLOCK
简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。
SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行。
在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。消息号1025表示该用户的事务因死锁而终止并被回滚。应用程序必须重新开始这个事务处理。
查找死锁原因
既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。定位死锁出错处主要经过以下三步:
1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。
2)结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别人的操作员。
3)根据锁定的库表与操作员的岗位,可以估计出程序大约出错处。询问操作员在死锁时执行的具体操作即可完全定位出错处。最后查找程序并修改之。
用sp_who获取关于被阻碍进程的信息
系统过程sp_who给出系统进程的报告。如果用户的命令正被另一进程保持的锁阻碍,则:
◆status列显示“lock sleep”。
◆blk列显示保持该锁或这些锁的进程标识,即被谁锁定了。
◆loginame列显示登录操作员。结合相应的操作员信息表,便可知道操作员是谁。
Fid spid status loginame origname blk dbname cmd
0 1 lock sleep lm lm 18 QJYD SELECT
0 2 sleeping NULL NULL 0 master NETWORK HANDLER
0 3 sleeping NULL NULL 0 master NETWORK HANDLER
……
用sp_lock浏览锁
要得到关于当前SQL Server上保持的锁的报告,可用系统过程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server进程id号,用sp_who可以得到锁定与被锁定的spid号:
◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表明锁的状态。前缀表明锁的类型:Sh—共享锁,Ex—排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。一旦正在障碍的进程一结束,其他进程就向前移动。“demand”后缀表明当前共享锁一释放,该进程就申请互斥锁。
◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。
执行该进程后屏幕显示
Fid Spid locktype table_id page row dbname Class context
0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur
0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock
0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur
……
定位出错处
根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。最后查找程序并修正之。
由于系统会自动牺牲死锁的一方,偶觉得死锁一般用sp_who和sp_lock很难看到。可使用打开"print deadlock information"选项,死锁信息会打印在errorlog中,但同时可能会带了部分性能的降低。
用DBArtisan或PADB等工具软件来检测出现问题的SYBASE,一发现有blk的,将其sql可以抓下来,而且很容易的就能将其处理。sp_who、sp_lock等输出的信息太多而且也不太好看懂。建议大家最好弄个DBArtisan来用用,很不错的!
=====================
Q&A
=====================
谢谢,我的意思我已知道锁表的ID,怎么找到锁表的程序语句!
--
请教如何找到SYBASE锁表的语句!
知道锁表的id,可以查当时的master库的sysprocesses表。
根据suid,spid,dbname可以从当时的sysprocesses(一至更新中......)中找到hostprocess字段即为操作系统的进程号!从而知道是那个程序导致锁表!
可写一存储过程迅速查出hostprocess!
要知道锁表的语句,只有从程序和当时锁的表进行分析了!
--
select l.spid,
locktype=convert(char(12),name),
dbname=convert(char(15),db_name(l.dbid)),
'table'=convert(char(15),object_name(l.id,l.dbid)),
page,
class=convert(char(15),class),
hostname,
cmd
from master..syslocks l,master..spt_values v,master..sysprocesses p
where l.type = v.number and
v.type = 'L' and
l.spid = p.spid
order by spid
--
用select object_name(id)
分享到:
相关推荐
Sybase 数据库锁机制和锁表查询 Sybase 数据库锁机制是指数据库管理系统中用于控制并发访问和维护数据一致性的机制。锁机制可以防止多个事务同时访问同一资源,避免数据的不一致和损坏。 在 Sybase 数据库中,锁...
**Sybase IQ官方文档概述** Sybase IQ是一款高效的数据仓库解决方案,专为大规模数据分析和决策支持而设计。作为Sybase公司的产品,它以其优秀的性能、可扩展性和对复杂查询的处理能力著称。本系列文档涵盖了从入门...
在IT领域,数据库管理系统是核心组件之一,Sybase作为一个历史悠久且功能强大的关系型数据库系统,被广泛用于企业级应用。本篇文章将详细讲解Sybase 15.7 64位驱动的安装与配置,以及如何设置Sybase数据源和在SQL ...
Sybase ASE for Linux 12.5 安装指南 本文档旨在指导用户如何在 RedHat AS 5 上安装 Sybase ASE for Linux 12.5。 installation process covers the creation of a Sybase directory, setting up the user and ...
**Sybase ASE12.5** 是Sybase公司推出的一款高度可扩展的企业级数据库管理系统,全称为Adaptive Server Enterprise。这个版本在1990年代末期发布,它以其高效性能、高可用性和数据安全性而受到业界的认可。ASE12.5在...
本文将详细探讨SYBASE SQL Server中的页锁、表锁机制及其在预防死锁方面的作用,旨在为数据库管理员和开发者提供深入理解,以优化数据库性能和提升事务处理效率。 首先,让我们从锁的基本类型开始探讨。在SYBASE ...
2.编辑sqladv-12_5\ini目录下的sql.ini文件,添加想要连接的Sybase服务器信息。 文件sqladv-12_5\ini\sql.ini中有个示例: [syb1254] master=NLWNSCK,192.168.1.5,5000 query=NLWNSCK,192.168.1.5,5000 你新添加...
**Sybase ASE ODBC Driver 下载** Sybase ASE(Adaptive Server Enterprise)ODBC(Open Database Connectivity)驱动程序是连接到Sybase ASE数据库的关键组件,它允许应用程序通过标准的ODBC接口与Sybase数据库...
标题中的“sybase12.5简单安装客户端”指的是Sybase Adaptive Server Enterprise(ASE)12.5版本的客户端安装程序。Sybase ASE是一款企业级的关系型数据库管理系统,广泛用于数据存储、管理和处理。这个“简单安装...
【DataX 同步 Sybase 数据到 HDFS】 DataX 是阿里巴巴开源的一款高效、稳定、可靠的批处理数据同步工具,支持多种数据源之间的数据迁移。本篇主要介绍如何使用 DataX 将 Sybase 数据库中的数据同步到 Hadoop 分布式...
Sybase16 ODBC驱动是专为Sybase数据库设计的,允许在Windows 7和Windows 10操作系统上,尤其是32位环境下,与Sybase数据库进行通信。这个驱动程序是为那些没有预装Sybase数据库但需要通过ODBC接口进行数据交互的应用...
Sybase 数据库是一款高效的企业级关系型数据库管理系统,广泛应用于金融、电信等关键领域。Java Database Connectivity (JDBC) 是Java编程语言与各种数据库交互的标准接口,它使得Java程序员能够方便地连接到Sybase...
sybase3驱动sybase3驱动sybase3驱动sybase3驱动sybase3驱动sybase3驱动sybase3驱动
Linux 64位系统安装Sybase 12.54的笔记内容涉及了安装Sybase数据库的详细步骤,包括环境准备、介质准备、用户创建、安装过程、常见问题的解决方法以及ODBC配置等方面的知识点。下面是根据提供的文件信息总结的详细...
【Sybase 数据库简介】 Sybase 是一款由 Mark B. Hiffman 和 Robert Epstern 在1984年创立的公司所开发的数据库产品,自1987年起正式推出。Sybase 提供了多种操作系统环境下的版本,包括UNIX、Novell Netware 和 ...
sybase 客户端1 sybase 客户端1 sybase 客户端1 sybase 客户端1 sybase 客户端1 sybase 客户端1 sybase 客户端1 sybase 客户端1 sybase 客户端1
《Sybase_v12.5最小客户端:理解与应用》 Sybase_v12.5是最小客户端版本,专门设计用于PC平台,被称为"Sybase_V12.5_PC_Client_lite"。这个轻量级的客户端是Sybase数据库管理系统的重要组成部分,它允许用户通过...
【Linux5.4下安装Sybase数据库】 在Linux5.4环境下安装Sybase数据库是一个涉及多个步骤的过程,本文将详细讲解如何在RHEL 5.2操作系统上进行安装。首先,确保你的系统满足以下基本要求: 1. **操作系统版本**:Red...
【Sybase数据库教程】 在IT领域,Sybase是一款强大的企业级关系型数据库管理系统,由美国Sybase公司开发。本教程将深入探讨Sybase的核心概念、组成及结构特征,特别是其在C/S架构中的应用。 一、C/S架构基础 1. C...