MySQL更新查询锁定表以便插入

时间:2016-03-27 11:02:57

标签: mysql database codeigniter

我遇到了问题,在同一主题上发现了几十个问题,但根据我的问题,我可能无法理解这些解决方案。

我有一个内置Codeigniter的系统,它执行以下操作

codeigniter-> start_transaction()

        UPDATE T SET A = 1, MODIFIED = NOW() 
        WHERE PK IN 
                ( SELECT PK FROM 
                                (SELECT PK, LAST_INSERT_ID(PK) FROM T 
                                    where FK = 31 AND A=0 AND R=1 AND R_FK = 21 
                                    AND DEAD = 0 LIMIT 0,1) AS TBL1 
                ) and A=0 AND R = 1 AND R_FK = 21 AND DEAD = 0

    -- what this query does is , it takes a row dynamically which is not dead yet,
 --and not assigned and it's linked to 21 id (R_FK) from R table, 
-- when finds the row, update it to be marked as assigned (A=1). 
-- PK = LAST_INSERT_ID(PK) ensures that last_insert_id is updated with this row id, so i can retrieve it from PHP 

GOTO MODULE B

MODULE B {

INSERT INTO T(A,B,C,D,E,F,R,FK,R_FK,DEAD,MODIFIED) VALUES(ALL VALUES)
 -- this line gives me lock wait timeout exceeded.
}

MySQL版本是5.1.63-community-log 表T是一个INNODB表,在FK字段上只有一个普通类型索引,并且没有外键约束。 PrimaryKey(PK)字段是auto_increment字段。

我在上面的情况下得到了锁等待超时,这是由于第一次事务更新持有锁定表,如何使用该更新查询避免锁定表,同时使用事务,我无法提交事务直到我收到MODULE B的回复。

我对数据库和结构性事物没有太多详细的了解,所以如果我说的话没有意义,请耐心等待。

- UPDATE-- - 表T结构

CREATE TABLE `T` (
  `PK` int(11) NOT NULL AUTO_INCREMENT,
  `FK` int(11) DEFAULT NULL,
  `P` varchar(1024) DEFAULT NULL,
  `DEAD` tinyint(1) NOT NULL DEFAULT '0',
  `A` tinyint(1) NOT NULL DEFAULT '0',
  `MODIFIED` datetime DEFAULT NULL,
  `R` tinyint(4) NOT NULL DEFAULT '0',
  `R_FK` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`PK`),
  KEY `FK_REFERENCE_54` (`FK`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Indexes Information

SHOW INDEX FROM T;

1- Field FK, Cardinality 65 , NULL => Yes , Index_Type => BTRee
2- Field PK, Cardinality 11153, Index_Type => BTRee

0 个答案:

没有答案