liuyong20395 发表于 2009-03-27 15:57

如何处理锁阻塞

程序因为比较大的而且多次点了查询,造成数据库阻塞,速度很慢。如何能比较快速的解除锁阻塞呢?

解决方案:
1,sp_lock与sp_who,查看锁的状态,然后kill掉相应的进程。
2,查看sybase在系统中进程,windows下结束进程或liunx下kill进程。
3,用dba工具查看锁状态,然后一次选中删除。

方案缺陷:
方法1:sp_who和sp_lock因为此时数据库已经较慢,显示锁阻塞和杀的过程中也耗时,速度并不占优。而且有的进程还要重复杀才能杀掉(测试时大约有30多个锁阻塞,大约超过5分钟后正常)
方法2:担心会造成数据不一致
方法3:个人认为较快。界面化操作,可以一次杀掉多个锁阻塞。


不知道还有那位有更好的方法可以处理锁阻塞的问题,可以一起分享下嘛?

D_D_D_D 发表于 2009-03-27 17:09

不一致应该不会产生,经常会阻塞的原因就多了,有可能是程序设计的问题,有可能是数据库锁级别设置的不合理,还是要从源头进行分析

chuxu 发表于 2009-03-27 18:01

先看一下锁的级别是什么,页级?表级?还是行级?
确定是否可以改为行级锁,以减少阻塞的可能

liuyong20395 发表于 2009-03-28 05:24

感谢上面两位的回复,不过程序应该说没有问题。
可能有的操作员无意多点了几次操作,造成了阻塞。
主要关心锁阻塞后的处理方法,不知道那位有更好的方法?

tyrone.dev 发表于 2009-03-29 04:21

LZ,不是说程序运行出来结果正确就代表没问题,用户多点几下就有长时间的锁产生,这就是明显的有问题。这种情况下有几种可能性,
1、点一次更新的内容太多,一下子更新了几十个表的记录或者一下子更新了N多条记录。如果是这种情况,应当在客户端限制用户不断的重复点。
2、更新的条数不多,还是有长时间的锁,第一可能是表是页锁,没有改成行锁。第二,有热表不断的使用,常见的有自已建表保存表的最大key值,每次都去取+1后在保存,或者直接从表中取max+1。第三可能是每个交易时间花费太长,可能是索引不对引起的。
3、如果需要kill进程来回收锁,这种系统实际使用时也是属于问题多多的系统。反正送我用,我也不会去用的。

liuyong20395 发表于 2009-03-30 10:19

原帖由 tyrone.dev 于 2009-3-29 04:21 发表 http://bbs3.chinaunix.net/images/common/back.gif
LZ,不是说程序运行出来结果正确就代表没问题,用户多点几下就有长时间的锁产生,这就是明显的有问题。这种情况下有几种可能性,
1、点一次更新的内容太多,一下子更新了几十个表的记录或者一下子更新了N多条记 ...


感谢你的回复,现实情况是你所说的第一种。操作员查询时条件少,查询数据量很大造成,已经修改程序不允许多次点击了。

不过上次发生了这种情况处理时间(先判断尝试kill,最后关闭sybase服务,总共耗时接近20分钟),现在就想对于这种问题有更快速的处理方法吗?

liuyong20395 发表于 2009-03-30 10:20

原帖由 tyrone.dev 于 2009-3-29 04:21 发表 http://bbs3.chinaunix.net/images/common/back.gif
LZ,不是说程序运行出来结果正确就代表没问题,用户多点几下就有长时间的锁产生,这就是明显的有问题。这种情况下有几种可能性,
1、点一次更新的内容太多,一下子更新了几十个表的记录或者一下子更新了N多条记 ...


感谢你的回复,现实情况是你所说的第一种。操作员查询时条件少,查询数据量很大造成,已经修改程序不允许多次点击了。

不过上次发生了这种情况处理时间(先判断尝试kill,最后关闭sybase服务,总共耗时接近20分钟),现在就想对于这种问题有更快速的处理方法吗?

tyrone.dev 发表于 2009-03-30 14:22

查询数据量,如果光查询的不会使用排它锁的,应当是更新吧,如果更新很多的话,并且kill的话,会rollback trans ,对事务已经超过1/2的处理来说kill了之后反而更花时间,这个是没有办法解决的。

chuxu 发表于 2009-03-30 17:33

原帖由 liuyong20395 于 2009-3-30 10:20 发表 http://bbs3.chinaunix.net/images/common/back.gif



感谢你的回复,现实情况是你所说的第一种。操作员查询时条件少,查询数据量很大造成,已经修改程序不允许多次点击了。

不过上次发生了这种情况处理时间(先判断尝试kill,最后关闭sybase服务,总共耗时 ...

我感觉这种问题处理的有效的方法是优化应用或者环境,避免出现长时间的锁阻塞,而不是等阻塞了再去处理。
页: [1]
查看完整版本: 如何处理锁阻塞