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'

--转自:http://blog.csdn.NET/rodjohnsondoctor/article/details/4323514

---

第1页:上线前的准备

第2页:维护时的注意事项

第3页:发生死锁后的对策

【IT168 技术文档】在新的数据库应用系统上线初期,由于测试不完善或不熟悉DB2的机制,常会出现锁等待死锁等现象存在于我们的应用系统中,如何捕获锁等待或死锁信息并解决锁问题,是保证平稳上线必须面对的问题。目前应用系统最常使用的DB2数据库版本有多个,有8.1,8.2,9.1还有新推出的9.5,对于不同版本的DB2数据库提供的解决办法不尽相同,下面对于上述问题的解决作了一个简单说明,希望对大家有用。

首先在上线前有几件跟锁相关的事情需要开发设计人员一定要做好

1. 相关参数的更改

注册表变量参数:

DB2_EVALUNCOMMITTED=on 当启用此变量时,在可能的情况下,它将进行表或索引访问扫描以延迟或避免行锁定,直到知道数据记录满足谓词求值为止。

DB2_SKIPDELETED=on 当启用此变量时,在可能的情况下,它允许使用无条件地跳过已删除的键或跳过已删除的行。

DB2_SKIPINSERTED=on 当启用此变量时,在可能的情况下,它允许跳过未落实的已插入行,就好像从未插入这些行一样。

数据库参数:

LOCKLIST 锁定列表的内存量,当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。如果不是自动,需要设置相对大一些;DB2默认是行锁,每个行锁大约占64或128个字节(64位数据库),计算锁定列表内存的大小公式是: ( 每个应用程序的平均锁定数目的估计值 * 每个锁定所需的字节数(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%,这里只是建议公式,实际情况还要视 *** 作系统实际的内存量来定。

MAXLOCKS 升级前锁定列表的最大百分比,默认是22%(windows)或10%(unix),可以根据要求自行改动,计算公式是 2 * 100 / maxappls

DLCHKTIME 死锁检测时间间隔,默认是10000毫秒(10秒),可以根据要求自行改动,也可不动。增大此参数以降低检查死锁的频率,因此增加应用程序必须等待消除死锁的时间。 减小此参数会增大检查死锁的频率,从而减少应用程序必须等待死锁解决的时间,但是会增加数据库管理器检查死锁所花的时间。

LOCKTIMEOUT 锁等待时间,默认是 -1,也就是永远等待,请改成固定的值,在事务处理(OLTP)环境中,可以使用 30 秒的初始启动值。在一个只查询的环境中,您可以从一个较高的值开始。

LOGFILSIZ 日志文件大小,此参数定义每个主日志文件和辅助日志文件的大小。如果数据库要运行大量更新、删除或插入事务,而这将导致日志文件很快变满,则应增大日志文件,了解您的并发应用程序的日志记录需求,来确定一个不会分配过量而浪费空间的日志文件大小。

LOGPRIMARY 主日志文件数,了解您的并发应用程序的日志记录需求,适当增大日志文件数。

注意: 在更新参数时,需要注意有些参数在更改后需要重新启动数据库DB2实例才可以生效;有些参数需要断开当前所有的应用程序,重新链接才能生效;有些参数可以立即生效,使用者请参考相关文档,注意参数生效特性。

2. 应用程序设计

-程序尽量短小精悍

-程序尽量晚地访问关键资源

-程序尽可能快地提交工作

-程序尽可能快地关闭游标

-建立合适索引

3. 性能测试

要根据将来实际的并发用户数和数据量进行测试

上线之后维护时我们要做的几件事情

1. 做好定期维护

通过使用如下命令进行维护:

-reorg表和索引定期重组

-runstats表和索引的统计信息定期更新

-rebind 程序包定期重新编译

步骤一:使用命令get snapshot来查询哪些进程锁了哪些表。

步骤二:使用命令force来断开这些进行了死锁的进程来。

步骤三: 使用命令list application查看是否已经断开了哪些进行了死锁的进程。

步骤一:使用命令get snapshot来查询哪些进程锁了哪些表。

步骤二:使用命令force来断开这些进行了死锁的进程来。

步骤三: 使用命令list application查看是否已经断开了哪些进行了死锁的进程。这样就可以解锁了

mysql数据库死锁解决方法如下:

1、对于按钮等控件,点击后使其立刻失效,不让用户重复点击,避免对同时对同一条记录 *** 作。

2、使用乐观锁进行控制。乐观锁大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是 通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数 据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。乐观锁机制避免了长事务中的数据 库加锁开销(用户A和用户B *** 作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。Hibernate 在其数据访问引擎中内置了乐观锁实现。需要注意的是,由于乐观锁机制是在系统中实现,来自外部系统的用户更新 *** 作不受系统的控制,因此可能会造 成脏数据被更新到数据库中。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存