【 TiDB 使用环境】测试
【 TiDB 版本】5.7.25-TiDB-v7.1.1
【复现路径】开启一个事务,先用insert插入A表数据,再使用Bulk Copy插入B表数据,在未commit的情况下,另外开启一个事务查询A表和B表
【遇到的问题:未提交情况下发现AB表已经写入了,使用ROLLBACK无法回退。Mysql无此问题正常回退】
https://forums.mysql.com/read.php?38,68934,68941#msg-68941
mysql 的bulk copy疑似背后使用的是 load data。
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
这是tidb load data 的文档:
https://docs.pingcap.com/zh/tidb/stable/sql-statement-load-data#mysql-兼容性
值得注意的是,兼容性介绍里面有这么两句:
* 无论以多少行为一个事务提交,`LOAD DATA` 都不会被显式事务中的 [`ROLLBACK`](https://docs.pingcap.com/zh/tidb/stable/sql-statement-rollback) 语句回滚。
* `LOAD DATA` 语句始终以乐观事务模式执行,不受 TiDB 事务模式设置的影响。
完全符合你的描述。
只能说,目前load data这个语句和mysql的兼容就是有点问题。
不能rollback,外加乐观事务模型执行,既然写明,issue就不能以bug来提交。你估计要在github上,提交一个特性/增强,看看官方何时解决了。
1 个赞
感谢大佬回复,很有参考价值,我还想问一下,Bulk Copy操作为何还会影响A表B表在未提交时的数据可以被另一个事务查询到,我目前隔离级别是REPEATABLE-READ
这个实现我看的也不是很明了,不过看着像是一边读取一边提交了。
所以你什么事务隔离级别都不好用。
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。