DB2数据库发生死锁了怎么办

DB2数据库发生死锁了怎么办,第1张

db2 get snapshot for locks on sample

db2 get db cfg for sample

db2 update db cfg using dlchktime 10000

-查看数据库管理器级别快照信息

db2 get snapshot for dbm

-查看数据库级别快照信息

db2 get snapshot for database on dbname

-查看应用级别快照信息

db2 get snapshot for application agentid appl-handler

注:appl-handler可以从list applicaitions的输出中得到

-查看表级别快照信息

db2 get snapshot for tables on dbname

注:需要把tables快照开关设为ON才会有作用

-查看锁快照信息

db2 get snapshot for locks on dbname

db2 get snapshot for locks on for application agentid appl-handler

-查看动态sql语句快照信息

db2 get snapshot for dynamic sql on dbname

db2 get monitor switches

db2 update monitor switches using lock on statement on

create event monitor mymonitor for deadlocks,statements write to file 'c:/temp'

set event monitor mymonitor state 1

db2evmon - path 'c:/temp'

--转自:>

数据库进程死锁应用场景如下:使用BizTalk从webservice接口获取数据,在存储过程GetExchangeConfig中设置每次获取的数据数量以及开始时间,获取数据后,Update获取数据的开始时间,使用存储过程UpdateExchangeConfig,在存储过程GetExchangeConfig中对开始时间进行Select *** 作,在存储过程UpdateExchangeConfig中对开始时间进行Update *** 作,产生数据库死锁,导致数据获取中断。SQL codeUSE [NotaryBusiness]GO/ 对象: StoredProcedure [dbo][GetExchangeConfig] 脚本日期: 01/26/2011 17:26:57 /SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo][GetExchangeConfig]/(@parameter1 int = 5,@parameter2 datatype OUTPUT)/AS/ SET NOCOUNT ON /select [Count],TimeBeginfrom ExchangeConfigfor xml autoRETURNSQL codeSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo][UpdateExchangeConfig]@TimeBegin as datetimeASupdate ExchangeConfig set TimeBegin=@TimeBeginRETURN------解决方案--------------------------------------------------------

官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。

这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。

看到这里,也许你会有这样的疑问,事务和谈判不一样,为什么事务不能使用完锁之后立马释放呢?居然还要 *** 作完了之后一直持有锁?这就涉及到 MySQL 的并发控制了。

MySQL的并发控制有两种方式,一个是 MVCC,一个是两阶段锁协议。那么为什么要并发控制呢?是因为多个用户同时 *** 作 MySQL 的时候,为了提高并发性能并且要求如同多个用户的请求过来之后如同串行执行的一样( 可串行化调度 )。具体的并发控制这里不再展开。咱们继续深入讨论两阶段锁协议。

官方定义:

对应到 MySQL 上分为两个阶段:

就是说呢,只有遵循两段锁协议,才能实现 可串行化调度 。

但是两阶段锁协议不要求事务必须一次将所有需要使用的数据加锁,并且在加锁阶段没有顺序要求,所以这种并发控制方式会形成死锁。

MySQL有两种死锁处理方式:

由于性能原因,一般都是使用死锁检测来进行处理死锁。

死锁检测的原理是构建一个以事务为顶点、锁为边的有向图,判断有向图是否存在环,存在即有死锁。

检测到死锁之后,选择插入更新或者删除的行数最少的事务回滚,基于 INFORMATION_SCHEMAINNODB_TRX 表中的 trx_weight 字段来判断。

MySQL如何处理死锁

Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决:

第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在 *** 作系统层级进行删除!

Connected to Oracle9i Enterprise Edition Release 92010 

Connected as quik

SQL> select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死锁的对象,获取其SESSION_ID

XIDUSN OBJECT_ID SESSION_ID LOCKED_MODE

---------- ---------- ---------- -----------

10 30724 29 3

10 30649 29 3

SQL> select username,sid,serial# from v$session where sid=29; --根据上步获取到的sid查看其serial#号

USERNAME SID SERIAL#

------------------------------ ---------- ----------

QUIK 29 57107

SQL> alter system kill session '29,57107'; --删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待一段时间看能否会自动消失,如长时间消失不掉,则需要做后续步骤

alter system kill session '29,57107'

ORA-00031: session marked for kill

SQL> select prospid from v$session ses,v$process pro where sessid=29 and sespaddr=proaddr; --查看spid号,以便在 *** 作系统中根据该进程号删除进程

SPID

------------

2273286

第二步:进入 *** 作系统进行删除进程,本示例的 *** 作系统是IBM aix。

login: root --录入用户名

root's Password: --录入密码

 

 

 Welcome to AIX Version 53! 

 

 

 Please see the README file in /usr/lpp/bos for information pertinent to 

 this release of the AIX Operating System 

 

 

Last unsuccessful login: Fri Apr 23 14:42:57 BEIDT 2010 on /dev/pts/1 from 1073

52254

Last login: Fri Apr 23 15:27:50 BEIDT 2010 on /dev/pts/2 from 107352254

# ps -ef|grep 2273286 --查看进程详情

root 2289864 2494636 0 17:07:15 pts/1 0:00 grep 2273286

oracle 2273286 1 0 14:38:24 - 0:21 oracleQUIK (LOCAL=NO)

# kill -9 2273286 --删除进程,小心 *** 作,别写错进程号,如果oracle的关键进程被删,数据库会崩溃的!

# ps -ef|grep 2273286 --再次查看

root 2289864 2494636 0 17:07:15 pts/1 0:00 grep 2273286

For Windows, at the DOS Prompt: orakill sid spid

For UNIX at the command line> kill –9 spid

SQL Server死锁使我们经常遇到的问题 下面就为您介绍如何查询SQL Server死锁 希望对您学习SQL Server死锁方面能有所帮助

SQL Server死锁的查询方法

exec master dbo p_lockinfo 显示死锁的进程 不显示正常的进程

exec master dbo p_lockinfo 杀死死锁的进程 不显示正常的进程

SQL Server死锁的解除方法

Create proc p_lockinfo

@kill_lock_spid bit= 是否杀掉死锁的进程 杀掉 仅显示

@show_spid_if_nolock bit= 如果没有死锁的进程 是否显示正常进程信息 显示 不显示

as

declare @count int @s nvarchar( ) @i int

select id=identity(int ) 标志

进程ID=spid 线程ID=kpid 块进程ID=blocked 数据库ID=dbid

数据库名=db_name(dbid) 用户ID=uid 用户名=loginame 累计CPU时间=cpu

登陆时间=login_time 打开事务数=open_tran 进程状态=status

工作站名=hostname 应用程序名=program_name 工作站进程ID=hostprocess

域名=nt_domain 网卡地址=net_address

into #t from(

select 标志= 死锁的进程

spid kpid a blocked dbid uid loginame cpu login_time open_tran

status hostname program_name hostprocess nt_domain net_address

s =a spid s =

from mastersysprocesses a join (

select blocked from mastersysprocesses group by blocked

)b on a spid=b blocked where a blocked=

union all

select |_牺牲品_>

spid kpid blocked dbid uid loginame cpu login_time open_tran

status hostname program_name hostprocess nt_domain net_address

s =blocked s =

from mastersysprocesses a where blocked<>

)a order by s s

select @count=@@rowcount @i=

if @count= and @show_spid_if_nolock=

begin

insert #t

select 标志= 正常的进程

spid kpid blocked dbid db_name(dbid) uid loginame cpu login_time

open_tran status hostname program_name hostprocess nt_domain net_address

from mastersysprocesses

set @count=@@rowcount

end

if @count>

begin

create table #t (id int identity( ) a nvarchar( ) b Int EventInfo nvarchar( ))

if @kill_lock_spid=

begin

declare @spid varchar( ) @标志 varchar( )

while @i<=@count

begin

select @spid=进程ID @标志=标志 from #t whereid=@i

insert #t exec( dbcc inputbuffer( +@spid+ ) )

if @标志= 死锁的进程 exec( kill +@spid)

set @i=@i+

end

end

else

while @i<=@count

begin

select @s= dbcc inputbuffer( +cast(进程ID as varchar)+ ) from #t whereid=@i

insert #t exec(@s)

set @i=@i+

end

select a 进程的SQL语句=b EventInfo

from #t a join #t b on a id=b id

lishixinzhi/Article/program/SQLServer/201311/22183

多个程序访问一个数据库出现死锁,你可以这么处理:

增加电脑整体性能配置,主板、网络、CPU/内存、电源都要好一些;

一些不是很重要的、可以设置延迟连接;

定时对数据库进行维护,优化;

程序也需要维护稳定,管理员工对程序的使用效率。

每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避免死锁等问题,文章以DB2(版本9)与为例进行讲解。

什么是数据库锁定与死锁

锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性;在设计与数据库交互的程序时,必须处理锁与资源不可用的情况。锁定是个比较复杂的概念,仔细说起来可能又需要一大篇,所以在本文中,只把锁定看作是一个临时事件,这意味着如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。

如何避免锁

我们可利用事务型数据库中的隔离级别机制来避免锁的创建,正确地使用隔离级别可使程序处理更多的并发事件(如允许多个用户访问数据),还能预防像丢失修改(LostUpdate)、读“脏”数据(DirtyRead)、不可重复读(NonrepeatableRead)及“虚”(Phantom)等问题。

隔离级别问题现象

丢失修改读“脏”数据不可重复读“虚”

可重复读取NoNoNoNo

读取稳定性NoNoNoYes

光标稳定性NoNoYesYes

未提交的读NoYesYesYes

表1:DB2的隔离级别与其对应的问题现象

在只读模式中,就可以防止锁定发生,而不用那些未提交只读隔离级别的含糊语句。沙河电脑培训发现一条SQL语句当使用了下列命令之一时,就应该考虑只读模式了

以上就是关于DB2数据库发生死锁了怎么办全部的内容,包括:DB2数据库发生死锁了怎么办、如何解决多线程造成的数据库死锁、数据库进程死锁,该如何处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9352466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存