mysql表状态locked_Mysql的死锁问题解决Locked状态

最近搬迁服务器也遇到一个问题,一个ecshop的站点,访问速度很慢,以前也没有这种情况发生,现在出现这么慢的情况确实让人疑惑,换了另外一个服务器也还是这样,可是访问的人也不多呢,带宽也不差,所以纳闷…

多搜索一下资料看看,似乎找到了出路,可以不用再尝试换服务器了。

我把表类型换为innodb类型后,情况就好很多了,请参考后面的资料。

sql语句类似 ALTER TABLE aslibra TYPE = innodb ; 很简单

其实碰到这个问题我就看了一下数据库的进程,发现有很多locked状态的查询语句,比较奇怪为何会这样,为什么会出现这样的情况的,这个情况很可能是读写限制所导致的,也可能是读写速度有关,可是不理解为何一直锁定而不放开,导致页面等待时间很长。况且读写也要求不高,带宽访问人数等都并不高呢?

换了一个数据库还是不行,看来得郁闷一阵了,搬服务器真能够让人变得暴躁,起码我就不耐烦了,搬来搬去的折磨的要死,就好像给你两个瓶子,从A瓶子倒东西到B瓶子,然后复制一份到A,把A搬走,A稳定后,又开始把A的东西挪到B,反复折磨人的意志。

查了些资料,记录一下,希望以后借鉴:

引用最近有个项目网站访问很慢。上去查了查,发现cpu经常100%,运行vmstat看了看,发现瓶颈不在cpu,不在磁盘上。系统是java+mysql,发现这两个东西也几乎不占用cpu,都是排在很后面的。

难道是网络问题,查了一下也不是,那么就是mysql内部问题。运行 SHOW PROCESSLIST,发现很多Locked,难道就是这个问题。因为一开始就把mysql设置成MyIasm的格式,因为这个速度比较快,不过这种格式是表锁定的,看来就是这里。于是改了程序中某些频繁更新的操作,做成cache,然后更新上去,现在速度好了。不过下来还是需要把数据库换成innodb格式。

由此得出结论,MyIasm适合读远大于写的情况,比如CMS之类的,而读写频繁的可能要innodb方式的。javaeye的robbin把数据库从myiasm换成innodb据说性能好了太多,看来也是这个问题。

2 《轻松掌握MySQL数据库锁机制的相关原理》

MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB 表进行行级锁定。在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型就比另一个好。一切取决于应用程序,应用程序的不同部分可能需要不同的锁类型。为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。例如,大多数Web应用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。基本MySQL MyISAM设置已经调节得很好。

在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。

对WRITE,MySQL使用的表锁定方法原理如下:

◆ 如果在表上没有锁,在它上面放一个写锁。

◆否则,把锁定请求放在写锁定队列中。

对READ,MySQL使用的锁定方法原理如下:

◆如果在表上没有写锁定,把一个读锁定放在它上面。

◆否则,把锁请求放在读锁定队列中。

当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。

这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。

如果INSERT 语句不冲突,可以自由为MyISAM 表混合并行的INSERT 和SELECT 语句而不需要锁定。

InnoDB 使用行锁定,BDB 使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB 自动获得行锁定,BDB 获得页锁定,而不是在事务启动时获得。

行级锁定的优点:

· 当在许多线程中访问不同的行时只存在少量锁定冲突。

· 回滚时只有少量的更改。

· 可以长时间锁定单一的行。

行级锁定的缺点:

· 比页级或表级锁定占用更多的内存。

· 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。

· 如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表,比其它锁定明显慢很多。

· 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。

在以下情况下,表锁定优先于页级或行级锁定:

· 表的大部分语句用于读取。

· 对严格的关键字进行读取和更新,你可以更新或删除可以用单一的读取的关键字来提取的一行:

? UPDATE tbl_name SET column = value WHERE unique_key_col = key_value ;

? DELETE FROM tbl_name WHERE unique_key_col = key_value ;

· SELECT 结合并行的INSERT 语句,并且只有很少的UPDATE或 DELETE 语句。

· 在整个表上有许多扫描或 GROUP BY 操作,没有任何写操作。

不同于行级或页级锁定的选项:

· 版本(例如,为并行的插入在MySQL中使用的技术),其中可以一个写操作,同时有许多读取操作。这明数据库或表支持数据依赖的不同视图,取决于访问何时开始。其它共同的术语是"时间跟踪"、"写复制"或者"按需复制".

· 按需复制在许多情况下优先于页级或行级锁定。然而,在最坏的情况下,它可能比使用常规锁定使用多的内存。

· 除了行级锁定外,你可以使用应用程序级锁定,例如在MySQL中使用GET_LOCK()和RELEASE_LOCK()。这些是建议性锁定,它们只能在运行良好的应用程序中工作。

为达到最高锁定速度,除InnoDB 和BDB 之外,对所有存储引擎,MySQL使用表锁定(而不是页、行或者列锁定)。对于InnoDB 和BDB 表,如果你用LOCK TABLES显式锁定表,MySQL只使用表锁定;如果你不使用LOCK TABLES,因为 InnoDB 使用自动行级锁定而BDB 使用页级锁定来保证事务隔离

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值