【问题标题】:"ERROR 1100 (HY000): Table '<table_name>' was not locked with LOCK TABLES" error because of a trigger\"ERROR 1100 (HY000): Table \'<table_name>\' was not locked with LOCK TABLES\" 错误,因为触发器
【发布时间】:2023-02-23 02:54:19
【问题描述】:

我在一个架构 (db1) 上有一个表 (my_table),我正试图迁移到同一服务器上的另一个架构 (db2)。为此,我在 db1 上创建了一个触发器,用于对 my_table 进行插入、更新和删除,实质上是将操作复制到 db2.my_table。一切都在开发中运行良好,但我们有一个奇怪的设置,其中这两个模式位于不同的 docker 图像上以用于迁移目的。所以 db1 在一个容器上,db2 在另一个容器上,两个不同的 mysql 服务器实例。

这会导致本地复制触发器出现问题,因此我在其中添加了一个 IF 子句,以确保在触发之前服务器上存在 db2。例如,这是 AFTER INSERT 触发器:

create trigger insert_my_table
    after INSERT
    on db1.my_table
    for each row
begin
    IF
        (SELECT EXISTS(SELECT SCHEMA_NAME
                       FROM INFORMATION_SCHEMA.SCHEMATA
                       WHERE SCHEMA_NAME = 'db2')) THEN
        insert into db2.my_table
        select *
        from db1.my_table ff
        where ff.id = NEW.id
        on duplicate key update db2.my_table.id=NEW.id;
    END IF;
end;

现在我可以毫无问题地在my_table 本地插入新行。但是,如果我尝试在插入之前锁定表格(例如 mysqldump 所做的):

lock tables `my_table` write;


insert into my_table (id, name, description) value (1, 'test', 'test_desc');

然后我得到这个错误

"ERROR 1100 (HY000): Table 'my_table' was not locked with LOCK TABLES"

是什么赋予了?有什么我忘记了吗?

【问题讨论】:

    标签: mysql docker triggers innodb


    【解决方案1】:

    我认为问题在于,一旦您锁定了会话中的任何表,该会话就只能访问已为其明确锁定的表。由于您正在db2 中写入my_table 并从information_schema.schemata 读取,因此您也必须锁定它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 2020-07-27
      • 2014-10-20
      • 2018-10-04
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多