浏览 5952 次
锁定老帖子 主题:MySQL数据库的锁引发的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-20
最后修改:2010-08-30
通过导出process list看,可以看到多个Update操作语句的状态为locked。导致的后果就是系统运行变慢,用户的Update操作失效(可能都被locked),在这种情况下只有重新启动服务器后系统恢复正常。使用是Mysql5.1版本的数据库。
在少量数据进行测试一个Update和insert频繁操作表的时候,运行良好。但是最近在实际运营中,数据量可能过大,导致很可能出现死锁现象。个人分析的思路如下: 引用 1. 分析locked操作的时候表,直接是与存在死锁发生的可能原因。 2. 分析locked操作的表中的触发器是否会引起死锁发生的可能原因。 3. 根据locked操作的表的类型分析是否有存在死锁发生的可能原因。 以上三点是现在个人真的出现的状态和解决的思路。希望有这方面实际经验的朋友指点下!大家都来谈谈吧!谢谢了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-08-22
mysql使用时,建议(1)尽量避免建立除主键索引外的唯一索引,否则会加重锁的竞争,很容易出现死锁。唯一性在应用程序里保证
(2)同时对多个表操作的场景里,一定要保证操作的顺序一致 |
|
返回顶楼 | |
发表时间:2010-08-22
有事务么?碰到过这种情况,非常诡异!去掉事务后成功
|
|
返回顶楼 | |
发表时间:2010-08-23
sw1982 写道 有事务么?碰到过这种情况,非常诡异!去掉事务后成功
lz 能不能将你碰到的情况,描述下。并且是在多大的数据量的时候出现那诡异的情况! 谢谢 |
|
返回顶楼 | |
发表时间:2010-08-29
明显是事务没有提交嘛
|
|
返回顶楼 | |
发表时间:2010-08-29
呵呵,是不是事务的timeout?楼主的存储引擎是innodb吧,建议楼主去掉所有表的外键,mysql是会锁键的。而且由于mysql的innodb没有行级锁,所以当数据量大时,如果对键的约束限制的太死,是很容易发生死锁的。
|
|
返回顶楼 | |
发表时间:2010-08-30
yuwenbao 写道 呵呵,是不是事务的timeout?楼主的存储引擎是innodb吧,建议楼主去掉所有表的外键,mysql是会锁键的。而且由于mysql的innodb没有行级锁,所以当数据量大时,如果对键的约束限制的太死,是很容易发生死锁的。
如果是死锁,应该会报deallock异常吧,但是没有出现死锁的异常,只是在mysql的进程中出现很多lock。的确存储引擎是使用innodb。 MySQL5.1不是支持对MyISAM和MEMORY表进行表级锁定,对InnoDB表进行行级锁定。 |
|
返回顶楼 | |
发表时间:2010-08-30
基本上mysql 行锁是不可用的,具体您可以分析下mysql的优化器规则。当他发现要全表扫描时,你的行锁也就被废掉了。
|
|
返回顶楼 | |
发表时间:2010-08-31
yuwenbao 写道 呵呵,是不是事务的timeout?楼主的存储引擎是innodb吧,建议楼主去掉所有表的外键,mysql是会锁键的。而且由于mysql的innodb没有行级锁,所以当数据量大时,如果对键的约束限制的太死,是很容易发生死锁的。
innodb只要是针对主键或者索引的,都会进行行锁,否则,则为表锁。另外,楼主有没有做删除操作?删除的时候要是查不到条件相符的要求,会进行表锁。最郁闷的是,当你一边在做无效删除,一边在有效插入的时候,就会导致死锁。所以删除先最好先查询下,如果有这个记录,再进行删除,否则不做删除。 |
|
返回顶楼 | |
发表时间:2010-09-02
Define:
比如说有两个线程,线程一要先更新记录A然后更新记录B,线程二要先更新记录B然后更新记录A,两个线程并发的情况下,很有可能就出现死锁。他们分别锁定了AB记录,又在等待获得另一条记录的锁权限。 Analyze: 程序中是否存在多线程批量进行数据库insert, update, delete动作,是否存在竞争状态 Improvement1: 是否可以去除批量提交 Improvement2: 是否可以考虑单线程 Improvement3:考虑对数据库操作进行排序 |
|
返回顶楼 | |