首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择“更新”并在重复键上插入“更新”会导致MYSQL中同一行插入的死锁。

选择“更新”并在重复键上插入“更新”会导致MYSQL中同一行插入的死锁。
EN

Stack Overflow用户
提问于 2018-06-07 16:15:02
回答 1查看 644关注 0票数 0

我同时执行多个事务,当通过SELECT FOR UPDATE查询检查同一行,并在重复键更新上插入或更新INSERT时,就会发生这种情况。但这会导致僵局。

下面是表模式

代码语言:javascript
复制
CREATE TABLE `t` (
  `a` varchar(40) NOT NULL,
  `b` date NOT NULL,
  `c` enum('a','b') COLLATE utf8_bin NOT NULL,
  `d` char(12) NOT NULL,
  `e` TINYINT(1) UNSIGNED NOT NULL,
  PRIMARY KEY (`a, `b`, `c`, `d` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

以下是事务操作。

事务1中的

代码语言:javascript
复制
Start Transaction;

SELECT  *
FROM t
WHERE
    a= '123'
        AND `b` = '2017-01-01'
        AND c= 'a'
        AND d= '1'
FOR UPDATE;

INSERT INTO t
(`a`, b, `c` , d, e)
VALUES ('123', '2017-01-01', 'a' , '1'  , '2')
ON DUPLICATE KEY UPDATE `e` = '2';

Commit;

事务2中的

代码语言:javascript
复制
Start Transaction;

SELECT  *
FROM t
WHERE
    a= '123'
        AND `b` = '2017-01-01'
        AND c= 'a'
        AND d= '1'
FOR UPDATE;

INSERT INTO t
(`a`, b, `c` , d, e)
VALUES ('123', '2017-01-01', 'a' , '1'  , '2')
ON DUPLICATE KEY UPDATE `e` = '2';

Commit;

当两个事务运行select for update并且其中一个事务尝试插入该行时,就会发生死锁。

注意到:我需要选择进行更新,因为在更新结果之前,我会根据先前的结果进行计数。死锁由于插入而被创建。

问题:我如何才能避免死锁问题?

EN

回答 1

Stack Overflow用户

发布于 2018-06-08 04:28:33

InnoDB的事务处理并不完全精确。为了性能考虑,一些非死锁被视为死锁,因为努力发现其他的不值得花费和罕见。

接受它吧。重新启动被关闭的事务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50745897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档