同一个事务中,不能百分百获得上一个sql提交的数据更新

【 TiDB 使用环境】线上
【 TiDB 版本】5.2.1
【遇到的问题】代码中有一个事务,事务中对其中的一张表的数据进行了更新,在事务的后边,会引用这张表进行sum,把结果数据更新到另一张表,以前在mysql上,没有发现问题;现在全面迁移到tidb后,发现有些数据对不上,事务中不能百分百的sum到最新的数据,目前tidb用的是悲观事务,事务隔离级别是repeateable,现在不确定问题出在哪儿

在MySQL上用的什么隔离级别

把隔离级别切换成 commit read 在试试

https://docs.pingcap.com/zh/tidb/stable/transaction-isolation-levels#与-mysql-read-committed-隔离级别的区别

repeateable

生产环境,不敢轻易切换

TiDB和MySQL在RR隔离级别下,行为还是有一些差异的,TiDB把SI近似认为成RR。在MySQL中,START TRANSACTION后不会立即创建快照,而是等第一条SQL执行的时候才创建快照。在TiDB中,START TRANSACTION就会立即创建一致性快照,等价于MySQL中的START TRANSACTION WITH CONSISTENT SNAPSHOT。所以在你的场景中,需要排查一下sum操作是什么时候开启事务的,会不会是因为TiDB中提前创建了这个快照,导致sum看不见更新后的数据

1 个赞

你自己单独会话级的切换就可以了

https://docs.pingcap.com/zh/tidb/stable/sql-statement-set-transaction

切换后,就对你这个会话有效,会话完毕后,就默认为全局参数了,不会改变原来的设置
但是可以帮你验证问题~

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