MySQL如何保证事务内一直读到最新数据?

问题:当出现某些特殊场景,一个事务A需要在未提交之前,一定要读取的是事务B提交的最新数据,该如何处理?

在MySQL中,事务隔离级别:读未提交、读提交、可重复读、串行化。

一、读未提交

读未提交会读到其它线程未提交的脏数据,虽然可以一直读到数据,但大部分都是脏数据,所以无法保证是最新有效的数据。

二、读已提交

可以保证一直读取有效数据,但普通事务无法保证可重复读。

三、可重复读

可以对某些特殊业务进行加行锁,使用共享锁(lock in share mode)即可保证一直读取最新数据。

当事务A、事务B同时begin时且未commit时,事务B修改了数据,若这里事务A如果在未提交情况下想要读取到最新数据,可以使用lock in share mode进行加锁读取,但是需要事务B进行提交。

注意:就算在“可重复读”模式下,加锁也会导致当前线程读取最新数据,mysql在加任何锁(如共享锁lock in share mode,排它锁for update,delete)之前都会获取最新数据,MySQL乐观锁通过Update版本号就是用的排它锁原理(防止多个线程同时加版本号出现错乱)

四、串行化

可以实现一直读最新数据,但效率低下。

posted @ 2023-07-25 18:05  yifanSJ  阅读(162)  评论(0编辑  收藏  举报