tidb_multi_statement_mode 开启后,事务执行有问题

insert into test123(ss) values(‘8888’);drop table test1234;insert into test123(ss) values(‘5555’);

golang 执行上述语句; 中间的drop table 语句报错,执行回滚后,仍然能够 向表test23插入数据 8888;

drop table test1234表名不对吧

ddl 是隐士提交了,你这开事务没用啊 ,drop table 就提交了前面dml

开启事务了,前面执行了,中间的ddl 没有执行

如果不是 ddl,即使报错 ,事务回滚,都执行不成功

如果ddl语句有问题,事务 对 ddl 语句不起作用吗?

insert into test123(ss) values(‘0000’);update test123 set sss=‘56’;insert into test123(ss) values(‘6666’); 像这样的语句 都可以回滚,执行不成功;

你不自己测试了吗? 只要有ddl 就隐士提交了,不能回滚,你这肯定是使用姿势不对啊,

我想写个 执行 批量sql 的 程序 如果遇到 这种 drop 语法写错的,就回滚不了呗;

ddl 事务回滚不了,是 数据库 本身的原因吗?

对的,正常drop 语句也不能写错了啊,写错了就误操作了 删库跑路了啊,你这应该看pg,pg数据库 这个常见应该可以回滚

故意能得表名 不对,这样就报错了,但第一条数据插入成功,事务不回滚;

正常 应该 有错误,都回滚才对 ,保证数据一致性; sqlserver 是可以回滚的; :yum:

去了解悲观和乐观,默认悲观。
默认 自动提交事务。 不要怀疑tidb基本的处理逻辑。
可以根据反馈 多了解下tidb 。某些地方和mysql也是有区别的。

pg 也可以, mysql和 tidb 都不行,我记得

好的 只是建议 : insert 语句报错可以回滚,drop 语句报错 就不回滚; 应该加个变量控制下;

:grinning: 谢谢

DDL本身这条语句回自动提交事务,可以理解为ddl语句一个语句就是一个事务,执行完它就会隐式自动commit提交事务

的确挺奇怪,需要看看底层日志。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。