在TiDB v5.3.0按楼主步骤测试未发现问题,楼主能否使用测试数据复现?
我的测试如下:
###################################
# 建表及准备测试数据 #
###################################
mysql> create table t3(id int not null auto_increment primary key, name varchar(30) not null , sex tinyint);
Query OK, 0 rows affected (0.14 sec)
mysql> create unique index uniq_name on t3(name);
Query OK, 0 rows affected (2.92 sec)
mysql> insert into t3 values(1, 'a1', 0), (2,'a2', 1), (3,'a3',0);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t3;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | a1 | 0 |
| 2 | a2 | 1 |
| 3 | a3 | 0 |
+----+------+------+
3 rows in set (0.01 sec)
###################################
# 按楼主的测试步骤测试 #
###################################
# 1、新开启一个事务,并通过select记录当前数据
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from t3;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | a1 | 0 |
| 2 | a2 | 0 |
| 3 | a3 | 0 |
+----+------+------+
3 rows in set (0.00 sec)
# 2、执行INSERT INTO ON DUPLICATE KEY UPDATE(提示了Query OK, 2 rows affected)
mysql> insert into t3(name, sex) values('a2', 1) ON DUPLICATE KEY UPDATE name=values(name), sex=values(sex);
Query OK, 2 rows affected (0.01 sec)
# 3、再次查询,可以发现和预期的一致(update部分被执行,数据被更新了)
mysql> select * from t3;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | a1 | 0 |
| 2 | a2 | 1 |
| 3 | a3 | 0 |
+----+------+------+
3 rows in set (0.01 sec)
# 4、提交事务(Query OK, 0 rows affected )
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
# 5、再次查询,数据是【有落盘】,此处与楼主的不一致(楼主测试结论为:5、再次查询,发现数据没有落盘,即:还是原来的数据。)
mysql> select * from t3;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | a1 | 0 |
| 2 | a2 | 1 |
| 3 | a3 | 0 |
+----+------+------+
3 rows in set (0.00 sec)
# 测试环境
mysql> select version();
+--------------------+
| version() |
+--------------------+
| 5.7.25-TiDB-v5.3.0 |
+--------------------+
1 row in set (0.00 sec)