gpt4 book ai didi

mysql死锁解释

转载 作者:行者123 更新时间:2023-11-29 07:04:52 24 4
gpt4 key购买 nike

我需要一些帮助来解决我面临的死锁情况。

下面是我的一个测试脚本,它模拟了我遇到的问题我有一个标签表,根据请求,它可能会在一个事务中插入/更新很多条目。

我知道死锁的发生是因为很多线程锁定了相同的条目,我想要一些关于如何避免它们的反馈

我正在运行 ab -n 100 -c 5 http://localhost/script.php

这是表格

CREATE TABLE `tags` 
(
`id` INT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(40) COLLATE utf8_unicode_ci DEFAULT NULL,
`weight` INT(8) DEFAULT NULL,
`type` ENUM('1','2','3') COLLATE utf8_unicode_ci DEFAULT NULL,
`modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `tag_name` (`name`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

<?php
function go() {

$db = DB::getInstance();
$db->start_transaction();
$tgs = array('electricity', 'emergency', 'trees', 'New Jersey', 'Canada funnelled');
foreach($tgs as $tg) {
$arr_tags = array(
'name' => $tg,
'weight' => '0',
'type' => TagTable::PRIMARY
);
$tag_instance = new Tag($arr_tags);
$tag_instance->save(true);
// the save method executes a query like the below
// INSERT INTO tags (weight, type, modified, id, name) VALUES(0, "1", NULL, NULL, "$tag") ON DUPLICATE KEY UPDATE weight = weight+1;

}
$db->commit();
}
go();
?>

最佳答案

令人惊讶的是,即使使用 InnoDB 也会发生死锁。这是什么原因?

clustered index (known internally as the gen_clust_index)可以在涉及批量 INSERT 的事务中间间歇性地锁定。事务中 INSERT 的有趣之处与 InnoDB 日志文件有很大关系。您插入的一行数据的先前状态是不存在的行之一。这样MVCC表示不存在的行的数据将记录在重做日志中以支持回滚、脏读和类似的事情。执行批量 INSERT 将创建大量这些不存在的行以进行回滚。

我曾经听过 DBA StackExchange 中一个人关于连续更新的死锁情况的一系列问题。以下是这些问题和我的回答:

您可能必须尝试使用​​以下任一方法在没有事务的情况下执行批量 INSERT:

  • 在每次 INSERT 后提交 COMMIT
  • 使用 AUTOCOMMIT=1

如果您必须在事务中插入 INSERT,请尝试增加 InnoDB 日志文件和 bulk insert buffer 的大小:

步骤 01) 将此行添加到/etc/my.cnf

[mysqld]
bulk_insert_buffer_size=256M
innodb_log_file_size=2047M

步骤 02) service mysql stop

步骤 03) rm -f/var/lib/mysql/ib_logfile[01]

步骤 04) service mysql start

mysql启动时,重新创建了ib_logfile0和ib_logfile1

试试吧!希望对您有所帮助。

更新 2011-10-31 12:43 EDT

I just answered a question like this in the DBA StackExchange 3 days ago

关于mysql死锁解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com