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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有事务的过程返回错误1746相关的知识,希望对你有一定的参考价值。

这是我的程序

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.

一旦我删除“更新”锁,它就会消失。

答案

见文档:

13.2.9 SELECT Syntax

...

此外,你不能在FOR UPDATE这样的陈述中使用SELECT作为CREATE TABLE new_table SELECT ... FROM old_table ...的一部分。 (如果您尝试这样做,语句将被拒绝,并且错误无法在创建'new_table'时更新表'old_table'。)这是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语句,该语句更改除正在创建的表之外的任何表。任何此类语句都不会执行,而是会因错误而失败。 这种变化的一个后果是FOR UPDATE可能不再与SELECTCREATE TABLE ... SELECT部分一起使用。 这意味着,在从先前版本升级之前,您应该重写任何导致其他表更改的CREATE TABLE ... SELECT语句,以便语句不再这样做。 此更改还会影响MySQL 5.6(或更高版本的从属服务器)与运行先前版本MySQL的主服务器之间基于语句的复制。在这种情况下,如果主服务器上导致其他表中的更改的CREATE TABLE ... SELECT语句在主服务器上成功,则该服务器上的语句仍会失败,导致复制停止。要防止这种情况发生,您应该使用基于行的复制,或者在主服务器上运行之前重写有问题的语句。 (Bug#11749792,Bug#11745361,Bug#39804,Bug#55876) 参考文献:另见:Bug#47899。

以上是关于带有事务的过程返回错误1746的主要内容,如果未能解决你的问题,请参考以下文章

在单个片段事务中添加多个返回堆栈条目

提交带有全屏片段的片段事务

片段事务中的实例化错误

对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

安卓。片段 getActivity() 有时返回 null

在android中使用带有片段的roboguice的任何简单示例?