当前位置: 首页 > 知识库问答 >
问题:

mysql保持并等待相同的锁

傅朗
2023-03-14
------------------------
LATEST DETECTED DEADLOCK
------------------------
2018-08-15 05:58:56 7fdff5872700
*** (1) TRANSACTION:
TRANSACTION 81567872, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 2
MySQL thread id 455326, OS thread handle 0x7fdff9083700, query id 255309181 10.8.201.34 slnbdata update
INSERT INTO XXX

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 8065 page no 11084 n bits 192 index `PRIMARY` of table `XXX` trx id 81567872 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) TRANSACTION:
TRANSACTION 81567879, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 2
MySQL thread id 455338, OS thread handle 0x7fdff5872700, query id 255309187 10.8.201.34 slnbdata update
INSERT INTO XXX

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 8065 page no 11084 n bits 192 index `PRIMARY` of table `XXX` trx id 81567879 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 8065 page no 11084 n bits 192 index `PRIMARY` of table `XXX` trx id 81567879 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** WE ROLL BACK TRANSACTION (2)
------------
TRANSACTIONS
------------
There do have a query before the insert:
SELECT
    pk_1,
    max(pk_2)
FROM
    table
WHERE
    pk_1 IN (...)
GROUP BY
    pk_1
but no queries between each insert.
And let me correct my reply above, the insert statement is:
insert into table_name(pk_1,pk_2 ...) values (1,1_1 ...) and insert into table_name(pk_1,pk_2 ...) values (2,2_1 ...)
We use foreach of mybatis like this:
   <insert id="save">
        <foreach collection="list" item="item" separator=";">
            INSERT INTO ...
CREATE TABLE `customer_address_info` (
  `customer_no` char(10) NOT NULL,
  `addr_index` int(1) unsigned NOT NULL,
  `addr_type` tinyint(1) NOT NULL,
  `province_code` char(6) DEFAULT NULL,
  `province_name` varchar(20) DEFAULT NULL,
  `city_code` char(6) DEFAULT NULL,
  `city_name` varchar(50) DEFAULT NULL,
  `county_code` char(6) DEFAULT NULL,
  `county_name` varchar(100) DEFAULT NULL,
  `zip_code` char(6) DEFAULT NULL,
  `detail` varchar(100) NOT NULL,
  `status` tinyint(4) unsigned NOT NULL,
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `create_user` varchar(30) NOT NULL,
  `modify_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `modify_user` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`customer_no`,`addr_index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

共有1个答案

锺离赤岩
2023-03-14

正如我所评论的,张贴的信息不足以看到全貌和了解真正的原因。我只会分享我的两分钱。

Show ENGINE INNODB状态指示每个转换都锁定了两行,并且有两个挂起的提交更改(2个行锁,undo log entries 2),因此同一事务中应该有其他语句,但没有显示。

事务1正在等待IX锁,这防止了由X锁由事务2保持;事务2正在等待事务1持有的IX锁。

可以通过从表中选择*获取IX进行更新。OP添加的select语句是一个简单的select语句,不需要锁。

 类似资料:
  • 我想用一个新的图例替换matplotlib图例,但保留被替换图例的相同(可能是任意)位置。 为什么下面的代码不能工作?

  • 问题内容: 如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案 确实 并行运行这两个操作,但如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。 如果您只想启动它们,并行运行它们,并获得

  • 问题内容: 我如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案确实并行运行这两个操作,但是如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。如果您只想启动它们,并行运行它们,并获得两

  • 问题内容: 我有两个div并排。我希望它们的高度相同,并且如果其中之一调整大小,则保持不变。我无法弄清楚这一点。有想法吗? 为了澄清我的困惑问题,我希望两个框的尺寸始终相同,因此如果一个框由于文本放置而增大,则另一个框应与高度匹配。 问题答案: flexbox 使用flexbox时,它是一个声明:

  • 问题 怎样在一个序列上面保持元素顺序的同时消除重复的值? 解决方案 如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题。比如: def dedupe(items): seen = set() for item in items: if item not in seen: yield item

  • HDFS设置: 未设置。 不返回任何内容。 我试图避免自己在加载后不得不在应用程序中重新分区。 是否有一种方法可以强制Spark用存储在HDFS上的相同数量的分区加载parquet文件?