TiDB事物

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 场景 + 问题概述
在测试tidb乐观锁时,发现insert一条数据后,select的结果只是最新插入的数据,之前的一条数据不显示了。

【应用框架及开发适配业务逻辑】

【背景】 做过哪些操作
测试tidb乐观事物

【现象】 业务和数据库现象
MySQL [test]> begin OPTIMISTIC;
Query OK, 0 rows affected (0.01 sec)

MySQL [test]> select * from t;
±—±-----+
| id | name |
±—±-----+
| 1 | b |
±—±-----+
1 row in set (0.00 sec)

MySQL [test]> insert into t values(1,‘c’);
Query OK, 1 row affected (0.00 sec)

MySQL [test]>
MySQL [test]> select * from t;
±—±-----+
| id | name |
±—±-----+
| 1 | c |
±—±-----+
1 row in set (0.00 sec)

MySQL [test]> select version();
±--------------------+
| version() |
±--------------------+
| 5.7.25-TiDB-v3.0.20 |
±--------------------+
1 row in set (0.00 sec)

MySQL [test]> show create table t;
±------±----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
±------±----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t | CREATE TABLE t (
id int(11) NOT NULL,
name varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
±------±----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

【问题】 当前遇到的问题

第一次select的结果是(1,‘b’),第二次查询的结果是(1,‘c’),不理解为啥第二次查询只显示(1,‘c’)。之前的(1,‘b’)这条数据去哪里了?

【业务影响】
自己测试,没业务影响
【TiDB 版本】
5.7.25-TiDB-v3.0.20

【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

表不是id作为主键么?主键重复还能插入成功?

根据官方文档,这个结果是正确的,乐观事务下, 执行 DML 语句时,乐观事务默认不会检查主键约束唯一约束,而是在 COMMIT 事务时进行这些检查。
对于select结果在下面的连接中也有示例,之前的数据没有丢失,在commit的时候会回滚。

https://docs.pingcap.com/zh/tidb/v4.0/transaction-overview#惰性检查

是主键啊,这是乐观事物,TiDB允许插入的。

我不明白为啥select的时候之前的数据查不出来,而是查询出来我最新插入的?

因为没有commit,所以当前id为1的记录就是后插入的(1,c)那条记录

多谢解答。

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