关于使用Bulk Copy导致事务失效问题

【 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

https://github.com/pingcap/tidb/blob/9794ea5b63db346bb487f64a7d7532ccca5c48b0/executor/load_data.go#L161

这个实现我看的也不是很明了,不过看着像是一边读取一边提交了。
所以你什么事务隔离级别都不好用。

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