程序添加事务后临时表报错

.NET程序,使用v6.5.2版本数据库,在代码中添加事务后,使用临时表报错,相同代码,连接mysql8.0执行正常。
将跟踪到的sql拿到查询分析器中执行正常。
tidb日志:

[2024/03/29 11:20:19.803 +08:00] [INFO] [session.go:3764] [GENERAL_LOG] [conn=2937701555370986845] [user=root@192.168.135.1] [schemaVersion=10423] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="use `tidb_test`"]

[2024/03/29 11:20:19.803 +08:00] [INFO] [session.go:3764] [GENERAL_LOG] [conn=2937701555370986845] [user=root@192.168.135.1] [schemaVersion=10423] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=tidb_test] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="SET NAMES utf8mb4;"]

[2024/03/29 11:20:19.803 +08:00] [INFO] [session.go:3764] [GENERAL_LOG] [conn=2937701555370986845] [user=root@192.168.135.1] [schemaVersion=10423] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=tidb_test] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="set session transaction isolation level repeatable read;"]

[2024/03/29 11:20:19.804 +08:00] [INFO] [session.go:3764] [GENERAL_LOG] [conn=2937701555370986845] [user=root@192.168.135.1] [schemaVersion=10423] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=tidb_test] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="start transaction;"]

[2024/03/29 11:20:23.043 +08:00] [INFO] [conn.go:1181] ["command dispatched failed"] [conn=2937701555370986845] [connInfo="id:2937701555370986845, addr:192.168.135.1:57074 status:11, collation:utf8mb4_general_ci, user:root"] [command=Query] [status="inTxn:1, autocommit:1"] [sql="
    CREATE TEMPORARY TABLE tmp_customer_base(c_no varchar(20), PRIMARY KEY (c_no));
    INSERT IGNORE INTO tmp_customer_base(c_no) values('11');
"] [txn_mode=PESSIMISTIC] [timestamp=448707276245827608] [err="[schema:1146]Table 'tidb_test.tmp_customer_base' doesn't exist"]

[2024/03/29 11:20:23.138 +08:00] [INFO] [session.go:3764] [GENERAL_LOG] [conn=2937701555370986845] [user=root@192.168.135.1] [schemaVersion=10423] [txnStartTS=448707276245827608] [forUpdateTS=448707276245827608] [isReadConsistency=false] [currentDB=tidb_test] [isPessimistic=true] [sessionTxnMode=PESSIMISTIC] [sql=rollback]

按日志组合sql执行,正常不报错。

USE `tidb_test`;
SET NAMES utf8mb4;
set session transaction isolation level repeatable read;

START TRANSACTION;

CREATE TEMPORARY TABLE tmp_customer_base(
    c_no varchar(20),
    PRIMARY KEY (c_no)
);

INSERT IGNORE INTO tmp_customer_base(c_no) values('11');
  1. 检查事务语法:确保您的事务语法是与v6.5.2版本的数据库兼容的。有些数据库版本可能在BEGIN TRANSACTION、COMMIT和ROLLBACK等语句上有不同的语法。
  2. 更新驱动:如果您使用的数据库驱动不是最新版本,请尝试更新到最新版本,因为新版本的驱动通常会修复一些已知的兼容性问题。

相同的sql,放在查询分析器里手工执行就不报错。
相同的sql,放到程序里,程序不加事务,在sql语句里加事务也没有问题。

DDL 这个执行了就提交了,事务管不住,不知道mysql8.0里面如果执行个 begin; create table ;rollback ,表还在不在。

我这个是临时表,不是实体表。并且,这个是创建后找不到表。

那给tidb提bug,语法不兼容 :grin:

:flushed:要不要再审一下题,手工执行不报错,程序执行报错。 :joy:

又仔仔细细看了一遍,程序执行,你的create和insert是一次发送过去的,手动执行是分了2次吧。
multiStatement 你找找这个设置,程序里关了是不是就和手动一样了。
瞎猜哈,关注最后你的答案。

:flushed:说的好像有道理啊,我还真没有跟踪过另外两种方式的tidb日志。下午跟踪看一下。


确实,上面那段是在语句里加事务,然后程序执行,下面那段是在程序里加事务。对应到tidb日志里就是两条。

那你程序改改,去掉那个参数后,一条一条的发,sql能正确执行吗?如果也能正确执行,那就是tidb的bug了吧,multistmt没处理好。

实际按照你的手工执行记录,你的start transaction在create table后面不是事务已经结束了?ddl默认提交事务啊。

哈?我验证一下~

begin 后显示执行ddl 算是提交了事务了

你验证下我说的那个,在连接字符串中有设置,然后看看程序一条一条的发送,tidb能不能正确处理。

验证了,没有提交事务,我再create后面加了个update实体表,报错之后实体表的值没有变,如果是ddl提交事务,应该实体表的值变了才对。

验证了,没有提交事务,我再create后面加了个update实体表,报错之后实体表的值没有变,如果是ddl提交事务,应该实体表的值变了才对。

验证了,一条一条的执行是可以的。但是实际代码操作上做不到 :joy:

你命令行试一下 ,再临时表创建后面 加个update, 然后rollback 后数据是否正确

能做到的,程序的连接字符串如果把 multi -statement 这个开关关闭后,驱动会自动按分号分割开的。你程序中怎么写都没事儿。