锁定通过触发器执行的表的后果?

时间:2011-07-08 01:53:07

标签: mysql sql database triggers locking

假设我有两个表,t1t2t1有一个触发器,因此在每个INSERT上,INSERT都会在t2上发生。

如果我在t2上获得写锁定,当我插入t1时会发生什么?这里有很多我很好奇的事情:

  1. 我还可以插入t1吗?或者它会锁定吗?

  2. 如果我可以插入t1就好了,这是否意味着触发器将排队,等到我解锁t2

  3. 如果我在t1锁定t2时将很多东西插入{{1}},那么对整体数据库性能有任何影响吗?这会保持连接打开还是类似的?

1 个答案:

答案 0 :(得分:2)

  1. t1将不是locked implicitly,因为如果您正在执行相反的操作,则隐式锁定解释的文档就是这种情况(锁定t1会锁定t2 < / LI>
  2. MySQL错误(ERROR 1100(HY000):表t1未锁定LOCK TABLES)将在尝试插入t1时生成,因为它尚未锁定,但目的地为它的触发器有。
  3. N / A,MySQL引擎不允许写入t1的查询。
  4. 但请考虑您的用例。如果您只是将INSERTS复制到另一个表中,而不是计算某些内容,则可能需要考虑使用复制。

    使用以下玩具行动日志的SQL验证MySQL 5.1:

    DROP TABLE IF EXISTS acts, actions;
    
    CREATE TABLE acts
    (
      act_id int unsigned not null auto_increment primary key,
      user_id int unsigned not null
    )
    ENGINE=innodb;
    
    CREATE TABLE actions
    (
      action_id int unsigned not null auto_increment primary key,
      act_id int unsigned not null,
      user_id int unsigned not null
    )
    ENGINE=innodb;
    
    DELIMITER #
    
    CREATE TRIGGER acts_post_ins_trigger AFTER INSERT ON acts
    FOR EACH ROW
    BEGIN
      INSERT INTO actions(act_id, user_id) VALUES (new.act_id, new.user_id);
    END#
    
    DELIMITER ;
    
    INSERT INTO acts VALUES(1,2);
    
    SELECT * FROM acts;
    SELECT * FROM actions;
    
    LOCK TABLE actions WRITE;
    
    SELECT('trying to SELECT acts w/ actions locked...') AS 'SELECT TEST';
    SELECT * FROM acts;
    SELECT('trying to INSERT into acts w/ actions locked...') AS 'INSERT TEST';
    INSERT INTO acts VALUES(3,4);
    
    UNLOCK TABLES;