代码之家  ›  专栏  ›  技术社区  ›  Art Em

带有事务的过程返回错误1746

  •  1
  • Art Em  · 技术社区  · 8 年前

    这是我的程序

    use my_database;
    drop procedure if exists sel_upd_ports;
    delimiter $$
    create procedure sel_upd_ports()
    begin
        drop temporary table if exists oneone;
        start transaction;
        create temporary table oneone as (select id,tt from table where status=0 limit 10 for update);
        update table a join oneone b on a.id=b.id set status=1;
        commit;
        select * from oneone;
        drop temporary table oneone;
    end$$
    delimiter ;
    

    这就是我需要的:

    1. 这必须是一个程序
    2. 更新+选择查询应在事务中工作,以便我的应用程序可以并发
    3. 过程应返回结果集

    这个过程可行,但我无法消除错误

    ERROR 1746 (HY000): Can't update table 'table' while 'oneone' is being created.
    

    一旦我删除了一个“用于更新”的锁,它就会消失。

    1 回复  |  直到 8 年前
        1
  •  1
  •   wchiquito    8 年前

    请参阅文档:

    13.2.9 SELECT Syntax

    ...

    此外,您不能使用 FOR UPDATE 作为 SELECT 在一个 声明,如 CREATE TABLE new_table SELECT ... FROM old_table ... . (如果您试图这样做,则该语句将被拒绝,并带有 错误 无法更新表' old\u表 '当' 新建\u表 '正在 创建。 )这是MySQL 5.5及更早版本的行为变化, 其中允许 CREATE TABLE ... SELECT 要在中进行更改的语句 正在创建的表以外的其他表。

    ...

    请参见MySQL 5.6发行说明:

    Changes in MySQL 5.6.2 (2011-04-11, Developer Milestone) :: Bugs Fixed

    • 不兼容的变更;复制: 无法再发出 CREATE TABLE ... SELECT 语句,该语句更改所创建表以外的任何表。未执行任何此类声明,且 而是失败并出现错误。

      这种变化的一个后果是 用于更新 可能不再是 完全用于 SELECT a部分 创建表。。。选择 .

      这意味着,在从以前的版本升级之前 应该重写任何 创建表。。。选择 导致 更改其他表,使语句不再这样做。

      此更改还对基于语句的复制有影响 在MySQL 5.6(或更高版本的从属服务器)和运行先前 MySQL版本。在这种情况下,如果 创建表。。。选择 主服务器上导致其他表更改的语句成功 在主服务器上,该语句在从服务器上失败,导致 要停止的复制。为了防止这种情况发生,你应该 使用基于行的复制,或在之前重写有问题的语句 在主机上运行它。(错误#11749792,错误#11745361,错误#39804, 错误#55876)

      参考文献:另请参见:Bug#47899。