Mysql:试图锁定时发现死锁,需要删除密钥吗?

时间:2017-01-12 07:13:53

标签: mysql sql database

我在Mysql中计算页面视图统计信息,有时会得到deat lock。

如何解决这个问题?也许我需要删除其中一个键?

但阅读表现会怎样?还是不影响?

表:

CREATE TABLE `pt_stat` (
  `stat_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` int(11) unsigned NOT NULL,
  `stat_name` varchar(50) NOT NULL,
  `stat_value` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`stat_id`),
  KEY `post_id` (`post_id`),
  KEY `stat_name` (`stat_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

错误:"尝试锁定时发现死锁;尝试重新启动交易"。

UPDATE pt_stat SET stat_value = stat_value + 1 WHERE post_id = "21500" AND stat_name = 'day_20170111';

1 个答案:

答案 0 :(得分:1)

在处理死锁时,首先要做的是查看是否有复杂的事务处于死锁状态。这是正常情况。我假设根据您的问题,更新语句在其自己的事务中,因此从逻辑数据库的角度来看,写入之间没有复杂的相互依赖性。

由于同一查询中的线程内的写入依赖性,某些多线程数据库(包括MySQL)可能会有单个语句死锁。在这里,MySQL并不孤单。已知MS SQL Server在某些情况下和工作负载中存在类似问题。问题(正如您所掌握的)是更新索引的线程可以对另一个更新索引的线程进行死锁(请记住,InnoDB表是包含行数据的叶节点的索引)。

在这些情况下,您可以做三件事:

  1. 如果问题不严重,那么最好的选择通常是在发生死锁时重试交易。
  2. 您可以减少后台线程的数量,但这会影响读写性能,或
  3. 您可以尝试删除索引(键)。但是,请记住,对MySQL的无索引扫描速度很慢。