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

更新和插入查询之间的死锁

有凯泽
2023-03-14

我在更新和插入查询之间的应用程序中遇到了死锁,我无法理解为什么以导致死锁的方式给出锁。

    null

更新`msc`SET`m_id`=110,`s_id`=1234,`c_id`='9b39cd',其中`msc`.`id`=54362

插入-

在`MSC'(`M_ID'、`S_ID'、`C_ID')中插入值(110、1235、'9B39CD')

    null
    ------------------------
    LATEST DETECTED DEADLOCK
    ------------------------
    2017-03-17 15:41:03 0x7f8039550700
    * (1) TRANSACTION:
    TRANSACTION 7784084, ACTIVE 2 sec inserting
    mysql tables in use 1, locked 1
    LOCK WAIT 11 lock struct(s), heap size 1136, 46 row lock(s), undo log entries 25
    MySQL thread id 493648, OS thread handle 140188693010176, query id 55263589 ip-10-198-7-203.ec2.internal 10.198.7.203 root update
    INSERT INTO MSC (m_id, s_id, c_id) VALUES (110, 1235, '9b39cd')
    * (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 1377 page no 10 n bits 152 index PRIMARY of table "db"."M" trx id 7784084 lock mode S locks rec but not gap waiting
    Record lock, heap no 67 PHYSICAL RECORD: n_fields 42; compact format; info bits 0
     0: len 4; hex 800000ac; asc     ;;
     1: len 6; hex 00000076c69f; asc    v  ;;
     2: len 7; hex 76000001cb24c5; asc v    $ ;;
     3: len 8; hex 999be72e2e07032e; asc    ..  .;;
     4: len 8; hex 999c22fa43025221; asc   " C R!;;

问题-我无法理解以下内容-1。为什么更新查询必须等待,并且在插入查询获得锁时无法获得锁?2.为什么更新查询需要/采用M表上的排他(X)锁。

请在这里分享你的想法。如果需要任何额外的信息,请让我知道。

共有1个答案

许明朗
2023-03-14

M表中是否存在110的id值?另外,在start transaction;commit;命令中包装这些单独的事务可能很有用,以确保在更新尝试运行之前完成插入。

示例:

START TRANSACTION;
INSERT INTO `MSC` (`m_id`, `s_id`, `c_id`) VALUES (110, 1235, '9b39cd')
COMMIT;

START TRANSACTION;
UPDATE `MSC` SET `m_id` = 110, `s_id` = 1234, `c_id` = '9b39cd', WHERE 
`MSC`.`id` = 54362
COMMIT;
 类似资料:
  • 我正在制作一个rest api,其中我必须根据id进行更新,并通过spring data在表中插入没有id基础的数据。但我发现在这两种情况下都有一个错误,它运行插入查询,只有更新不工作 存储库文件@repository公共接口CustomerRepository扩展JpaRepository{CustomerEntity save(CustomerEntity CustomerEntity);Cu

  • 问题内容: 我正在尝试在postgres中执行以下操作: 但是,即使使用文档(http://www.postgresql.org/docs/9.0/static/sql- update.html )中提到的postgres 9.0,也无法实现第1点 同样,第二点似乎不起作用。我收到以下错误:子查询必须仅返回一列。 希望有人对我有解决方法。否则查询将花费大量时间:(。 仅供参考:我正在尝试从几张表中

  • 我试图在spring jpa中更新多个表。正在更新使用者表,但提供者表无法更新。相反,它尝试插入导致违反主键,这是预期的,因为它尝试插入而不是更新。虽然我对这两个表的代码流是相同的,但只有生产者有问题。这是我的消费者实体 这是我的消费者存储库 这是我的提供商实体 这是我的提供商存储库 这是日志

  • OTA更新查询与下载 获取access_token 终端设备 终端设备直接接入OTA服务器应当使用Client Credentials模式,client_id为设备id,client_serect为设备令牌. App接入 如果终端设备无法直接接入OTA服务器,而通过App中转,那么App应当也使用Client Credentials模式,client_id为app_id,client_secret

  • 问题内容: 我目前正在编写更新语句,以使可查询表保持最新状态。这两个表之间的架构相同,内容也不重要: 我的更新语句如下所示: 需要注意的两件事是:1)更新结束时没有where子句(这可能是问题所在); 2)更新后的所有记录都具有相同的值。我的意思是: 我的问题是如何解决此问题,以使表正确地将登台的“新”数据反映为正确的SQL更新? 更新 因此,我的登台数据可以恰好反映了其中的内容,为了便于讨论,它

  • 问题内容: 在我的tempTBL上,我的linksTBL上有ID,名称,URL,猫,被插入的列TBL我的类别上的ID:名称,别名列在TBL上我在extraTBL上有:cl_id,link_id,cat_id我有:id,link_id,值 我如何执行单个查询以从tempTBL中选择isinsrted = 0的所有项目,然后将它们插入linksTBL并为插入的每个记录选择拾取ID(主要的),然后将该I