带有事务的过程返回错误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 ;
这就是我需要的:
- 它必须是一个程序
- 更新+选择查询应该在事务中工作,所以我的应用程序可以是并发的
- 过程应返回结果集
这个程序有效,但我无法摆脱错误
ERROR 1746 (HY000): Can't update table 'table' while 'oneone' is being created.
一旦我删除“更新”锁,它就会消失。
答案
见文档:
...
此外,你不能在
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
可能不再与SELECT
的CREATE TABLE ... SELECT
部分一起使用。 这意味着,在从先前版本升级之前,您应该重写任何导致其他表更改的CREATE TABLE ... SELECT
语句,以便语句不再这样做。 此更改还会影响MySQL 5.6(或更高版本的从属服务器)与运行先前版本MySQL的主服务器之间基于语句的复制。在这种情况下,如果主服务器上导致其他表中的更改的CREATE TABLE ... SELECT
语句在主服务器上成功,则该服务器上的语句仍会失败,导致复制停止。要防止这种情况发生,您应该使用基于行的复制,或者在主服务器上运行之前重写有问题的语句。 (Bug#11749792,Bug#11745361,Bug#39804,Bug#55876) 参考文献:另见:Bug#47899。
以上是关于带有事务的过程返回错误1746的主要内容,如果未能解决你的问题,请参考以下文章