事物隔离级别

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

【概述】 场景 + 问题概述

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

【背景】 做过哪些操作



【现象】 业务和数据库现象
tidb没看见事务回滚啊。现象和mysql是一样的,都是可以更新虽然有些已经被更改了
【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】

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


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

这个没有理解啥意思

首先,你得告知你的环境,是乐观模式,还是悲观模式

然后 你说的场景是针对两个事务在同一时间内,发生写写冲突

乐观模式
X 原值 20,Y 原值 10
比如
T1, 更新 X = 50,Y = 100
T2, 更新 X = 10,Y = 5
然后 T1,先打开事务,执行语句,但是不提交
然后T2,打开事务,并且提交,T2 提交成功
然后 T1 在提交,你会发现提交失败,可能会重试(如果开启了重试)

悲观模式
T1 锁定了,T2 在执行阶段就报错了,还没到提交

我这样答复,看对你有没有帮助!:nerd_face:

1赞

环境时v5.0.0 默认悲观模式, rr的隔离界别

session 1; session2;
begin; begin;
select * from a; select * from a; //id=2 === order_id =2
update a set order_id = 22 where id = 2;
//修改一条记录
select * from a; //id=2 === order_id =22 select * from a; //id=2 === order_id =2
(表记录
1 1 1 1
2 2 ====> 2 22
3 3 3 3
22 22 22 22
23 22 23 22
)
commit;
select * from a where order _id = 22; // 看到了两条记录
update a set order_id = 2112 where order _id = 22; //显示结果影响3条
commit; //修改可以成功,不会回滚,修改了3条
ps:这个测试结果时和mysql5.7 rr 一致的啊? 不是说tidb如果需要修改的记录又新的版本,就会回滚么? 难道我理解的不对?

这个图片是测试过程
ps:这个测试结果时和mysql5.7 rr 一致的啊? 不是说tidb如果需要修改的记录又新的版本,就会回滚么? 难道我理解的不对?

表结构上面有。 id 为主键

理解的有偏差啊,T2 已经能看到 order_id = 22 的结果了,你做修改的执行和提交,一定会成功啊(因为不存在冲突了)

你希望得到什么?

rr 级别下 t2 是看不到t 提交的,他查询order_id=22 是两条记录,但是实际修改的时候是修改3考,我看文档说这个时候事务不是会不成功么? 因为mysql这个时候是幻读的一种方式,tidb和mysql不是不一样的么?


主要是这个更新不可见数据 tidb会失败怎么理解,不是上面这种情况么? 其中id=2 那个就是更新的不可见数据啊

幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

幻读是这样定义的,不是update… 是 insert…

幻读诗这种,我是说rr会造成这种方式,除非当前读才能发现,但是这都不是重点。

重点是怎么理解tidb文档中的说法,关于更新世不检查当前版本是否可tidb会导致事务回滚

乐观模式…

这个说的是乐观模式的现象么? 我看这一段,没特殊说明,而且在悲观模章节下

悲观模式,是后面才出来的,就是为了解决高并发,冲突比较多的情况

你可以试试,验证一下!