论坛首页 综合技术论坛

MySQL数据库的锁引发的问题

浏览 5957 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-20   最后修改:2010-08-30
  在少量数据进行测试一个Update和insert频繁操作表的时候,运行良好。但是最近在实际运营中,数据量可能过大,导致很可能出现死锁现象。通过导出process list看,可以看到多个Update操作语句的状态为locked。导致的后果就是系统运行变慢,用户的Update操作失效(可能都被locked),在这种情况下只有重新启动服务器后系统恢复正常。使用是Mysql5.1版本的数据库。

个人分析的思路如下:
引用

1. 分析locked操作的时候表,直接是与存在死锁发生的可能原因。
  2. 分析locked操作的表中的触发器是否会引起死锁发生的可能原因。
  3. 根据locked操作的表的类型分析是否有存在死锁发生的可能原因。

以上三点是现在个人真的出现的状态和解决的思路。希望有这方面实际经验的朋友指点下!大家都来谈谈吧!谢谢了
   发表时间:2010-08-22  
mysql使用时,建议(1)尽量避免建立除主键索引外的唯一索引,否则会加重锁的竞争,很容易出现死锁。唯一性在应用程序里保证
(2)同时对多个表操作的场景里,一定要保证操作的顺序一致
0 请登录后投票
   发表时间:2010-08-22  
有事务么?碰到过这种情况,非常诡异!去掉事务后成功
0 请登录后投票
   发表时间:2010-08-23  
sw1982 写道
有事务么?碰到过这种情况,非常诡异!去掉事务后成功

lz 能不能将你碰到的情况,描述下。并且是在多大的数据量的时候出现那诡异的情况! 谢谢
0 请登录后投票
   发表时间:2010-08-29  
明显是事务没有提交嘛
0 请登录后投票
   发表时间:2010-08-29  
呵呵,是不是事务的timeout?楼主的存储引擎是innodb吧,建议楼主去掉所有表的外键,mysql是会锁键的。而且由于mysql的innodb没有行级锁,所以当数据量大时,如果对键的约束限制的太死,是很容易发生死锁的。
0 请登录后投票
   发表时间:2010-08-30  
yuwenbao 写道
呵呵,是不是事务的timeout?楼主的存储引擎是innodb吧,建议楼主去掉所有表的外键,mysql是会锁键的。而且由于mysql的innodb没有行级锁,所以当数据量大时,如果对键的约束限制的太死,是很容易发生死锁的。


如果是死锁,应该会报deallock异常吧,但是没有出现死锁的异常,只是在mysql的进程中出现很多lock。的确存储引擎是使用innodb。

MySQL5.1不是支持对MyISAM和MEMORY表进行表级锁定,对InnoDB表进行行级锁定。
0 请登录后投票
   发表时间:2010-08-30  
基本上mysql 行锁是不可用的,具体您可以分析下mysql的优化器规则。当他发现要全表扫描时,你的行锁也就被废掉了。
0 请登录后投票
   发表时间:2010-08-31  
yuwenbao 写道
呵呵,是不是事务的timeout?楼主的存储引擎是innodb吧,建议楼主去掉所有表的外键,mysql是会锁键的。而且由于mysql的innodb没有行级锁,所以当数据量大时,如果对键的约束限制的太死,是很容易发生死锁的。

innodb只要是针对主键或者索引的,都会进行行锁,否则,则为表锁。另外,楼主有没有做删除操作?删除的时候要是查不到条件相符的要求,会进行表锁。最郁闷的是,当你一边在做无效删除,一边在有效插入的时候,就会导致死锁。所以删除先最好先查询下,如果有这个记录,再进行删除,否则不做删除。
0 请登录后投票
   发表时间:2010-09-02  
Define:
比如说有两个线程,线程一要先更新记录A然后更新记录B,线程二要先更新记录B然后更新记录A,两个线程并发的情况下,很有可能就出现死锁。他们分别锁定了AB记录,又在等待获得另一条记录的锁权限。

Analyze:
程序中是否存在多线程批量进行数据库insert, update, delete动作,是否存在竞争状态

Improvement1: 是否可以去除批量提交
Improvement2: 是否可以考虑单线程
Improvement3:考虑对数据库操作进行排序
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics