假设我有两个表,t1
和t2
。 t1
有一个触发器,因此在每个INSERT上,INSERT都会在t2
上发生。
如果我在t2
上获得写锁定,当我插入t1
时会发生什么?这里有很多我很好奇的事情:
我还可以插入t1
吗?或者它会锁定吗?
如果我可以插入t1
就好了,这是否意味着触发器将排队,等到我解锁t2
?
如果我在t1
锁定t2
时将很多东西插入{{1}},那么对整体数据库性能有任何影响吗?这会保持连接打开还是类似的?
答案 0 :(得分:2)
t1
将不是locked implicitly,因为如果您正在执行相反的操作,则隐式锁定解释的文档就是这种情况(锁定t1
会锁定t2
< / LI>
t1
未锁定LOCK TABLES)将在尝试插入t1
时生成,因为它尚未锁定,但目的地为它的触发器有。t1
的查询。但请考虑您的用例。如果您只是将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;