2个回答
-
事实上,在很多业务场景中,重复读取不同的数据是对的,(后一次是最新的数据),但重复读取相同的数据是错误的。
当交易隔离级别设置为不可重复读取时,可以在交易中重复读取操作**,这似乎很矛盾,就像在十字路口竖立了一个牌子,上面写着“不要闯红灯”,但实际上,你也可以闯入,那个提示只是告诉你可能有危险! 同样的道理,其实在“不可重复读取”级别下重复读取是可以的,mysql本身不会因为你的重复读取而被迫报错或终止,但可能会因为重复读取而造成问题,或者可能没有问题,不代表会有错误, 有些场景,两次读取是不同的,第二次是最新的数据,可能确实不错,但在某些场景下,重复读取数据保持不变(显然数据是由其他交易更新的)可能是错误的。
至于哪些场景会有问题,我觉得应该是那种产生瞬时数据的场景,比如今天12:00:00,访问次数是1000,一个交易在这个时间点就要拿1000了,然后回来生成一个报告,这个时候,另一个交易把这个1000改成了2000, 但这个 2000 年是 12 个:
00:01 访问量,这种场景,重复读取有问题,因为不准确。 但是有些场景,比如只需要生成最新的报告,不问时间,越新越好,这里重复读取没有问题,而且有类似的余额处理,如果是楼上那个刷卡的场景,更新和两次读取不一样(后面跟着最新数据)我觉得是对的, 所以需要根据业务场景,用正确的隔离级别和适当的**来判断是对还是错。
-
编一个刷卡的场景,你要支付100元,你在一笔交易中选择一个账户,发现它的余额100元就够用了,于是你启动了减余额操作,做更新xx设置余额=余额-100,其中...因此,其他交易的余额在更新前变为 50,在更新后变为 -50。
相关回答