MySql 错误 > 超过锁定等待超时;尝试重新启动事务 SQLState : 41000 VendorError: 1205

标签 mysql locking

多年来,我一直在处理这个问题,但一直未能追根究底。我不知道是什么导致了这些锁定。

错误是:Lock wait timeout exceeded; try restarting transaction SQLState: 41000 VendorError: 1205

SQL 语句是在事务中运行的单个插入语句。所有插入都是这种形式,因此没有批量插入或混合模式插入等。

INSERT INTO attachment( id, entityid, entitytype , addeduserid , deleteduserid , fullpath , filename, status, creationdate, lastupdated, deletiondate, hasfile,notes,history,type,mimeinfo,archivedby,archivedon, referencedate,changedby,changedon ) values (0,0,2,360,null,NULL,NULL,1,'2013-02-20 08:45:31','2013-02-20 08:45:31',NULL,0,NULL,'20/02/2013 08:45:UserA:File uploaded internally. <br>',0,NULL,null,NULL,NULL,null,NULL);

系统配置: Mysql version: 'Server version: 5.1.61 Source distribution' (on Redhat)

存储:INNODB

INNODB相关配置(部分来自my.cnf编辑):

innodb_file_per_table=1
innodb_buffer_pool_size=3G
innodb_additional_mem_pool_size=20M
innodb_log_file_size=512M
innodb_log_files_in_group=2
innodb_log_buffer_size=16M
innodb_support_xa=1
innodb_doublewrite=1
innodb_thread_concurrency=0
innodb_flush_log_at_trx_commit=2
innodb_autoinc_lock_mode=2**
innodb_rollback_on_timeout=1
innodb_locks_unsafe_for_binlog=1**
thread_cache_size=8
query_cache_size=256M
query_cache_limit=4M
table_cache=2048
table_definition_cache=1024
tmp_table_size=512M
max_heap_table_size=512M
transaction-isolation=READ-COMMITTED**
innodb_table_locks=0**
innodb_lock_wait_timeout=50**

** 这些是针对此问题专门添加的。

通常:

系统(即有 6 个应用程序实例,每个实例都具有相同的数据库结构,都在一个 mysql 实例上运行)可以正常运行数天,然后可以在锁定等待开始发生的地方运行,并且通常会使它们出现在组中在一天的时间里。每个单独的错误都会反复出现,因为一旦失败,我会重试,一般重试都会失败。我已配置为重试 4 次。锁通常只会发生在几个不同的表上。

今天的问题具体实例:

今天早上 attachment table ,自昨晚以来, table 上就没有插入过。自前一天晚上以来,桌面上也没有任何更新。 如果锁与其他用户进行更新和插入无关,那么某些 select 语句是否会导致锁?我试图确保所有选择语句都使用 attachment_general_index

由于我主要在几个不同的表上获取它 - 这是该表的结构。

CREATE TABLE `attachment` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`entityid` int(10) unsigned DEFAULT NULL,
`entitytype` tinyint(3) unsigned NOT NULL DEFAULT '0',
`addeduserid` int(10) unsigned NOT NULL,
`deleteduserid` int(10) unsigned DEFAULT NULL,
`fullpath` varchar(255) DEFAULT NULL,
`filename` varchar(255) DEFAULT NULL,
`status` tinyint(3) unsigned NOT NULL DEFAULT '0',
`creationdate` varchar(40) DEFAULT NULL,
`lastupdated` varchar(40) DEFAULT NULL,
`deletiondate` varchar(40) DEFAULT NULL,
`hasfile` tinyint(3) unsigned NOT NULL DEFAULT '0',
`notes` text,
`history` text,
`type` tinyint(3) unsigned DEFAULT '0',
`lastupdatedby` int(10) DEFAULT '0',
`lastupdatedinfo` varchar(255) DEFAULT NULL,
`mimeinfo` varchar(255) DEFAULT NULL,
`archivedby` int(10) unsigned DEFAULT NULL,
`archivedon` varchar(40) DEFAULT NULL,
`referencedate` varchar(40) DEFAULT NULL,
`changedby` int(10) unsigned DEFAULT NULL,
`changedon` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `attachment_addeduserid_fkey` (`addeduserid`),
KEY `attachment_deleteduserid_fkey` (`deleteduserid`),
KEY `attachment_archivedby_fkey` (`archivedby`),
KEY `attachment_changedby_fkey` (`changedby`),
KEY `attachment_general_index` (`entitytype`,`entityid`,`status`,`type`),
CONSTRAINT `attachment_ibfk_1` FOREIGN KEY (`addeduserid`) REFERENCES `user` (`id`),
CONSTRAINT `attachment_ibfk_2` FOREIGN KEY (`deleteduserid`) REFERENCES `user` (`id`),
CONSTRAINT `attachment_ibfk_3` FOREIGN KEY (`archivedby`) REFERENCES `user` (`id`),
CONSTRAINT `attachment_ibfk_4` FOREIGN KEY (`changedby`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3619 DEFAULT CHARSET=latin1$$

我附上了最近的 SHOW INNODB STATUS,这是今天的,从昨天开始就没有锁等待了。我不理解所有这些输出,但最主要的是锁似乎从未出现在这里。我假设是因为它们没有被归类为死锁?

https://docs.google.com/document/d/1Hslf2B594n8ofAUYxN54Gh8FrSCIFNGGMtthVI_Lv4k/pub

是否只有死锁区域对这个问题感兴趣?如果有其他地区发生时我会尽量收集并可以提供。

如有任何帮助,我们将不胜感激。

尼克

最佳答案

我想与那些因事务超时而绞尽脑汁并发现建议的服务器配置更改都无济于事的人分享我的“找到了”时刻。

我陷入了困境,以至于我正在认真考虑重写我的一些应用程序,以便我可以适应事务超时(全世界都听到了集体提示)。

我对从我的业务交易中丢失任何东西感到疑惑,所以我运行了一个 cron 作业,它全天每 10 分钟执行一次完整的 mysqldump(这是在双重复制之上)。

我发现的是 mysqldump 霸占了服务器,锁定了表,并且几乎禁止任何其他东西在数据库运行时使用它。当我发现事务失败与 mysqldump 运行时间同时发生时,我的灵光一现。

长话短说,有 3 个命令行选项可以防止 mysqldump 杀死您的服务器。这些是

  1. --单笔交易
  2. --快速
  3. --lock-tables=false

非常感谢 CA3LE @ How can I slow down a MySQL dump as to not affect current load on the server?启发我。

关于MySql 错误 > 超过锁定等待超时;尝试重新启动事务 SQLState : 41000 VendorError: 1205,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14978480/

相关文章:

php - 数据库输出未显示。获取 else 语句

php - 使用 php 数组创建 mysql 查询

java - 从 JFrame 获取字符串值到 Java 类

MySql 列出总和 > 0 的所有字段

mysql - 简单 SQL 最大列查询

sql - 在 SQL Server 中创建连续的发票编号而无需竞争条件

objective-c - NSLock + 原子属性 vs 非原子

与对象锁混淆的java同步

mysql - 使用 LOCK TABLES 回滚事务

java - 如何让其他线程等待给定的任务结果