关于数据库读写分离读问题,求大神指导
数据库读写分离是希望数据库修改操作不影响数据库查询读效率。
那么问题来了
1:如果不进行读写分离,也是可以同时进行修改跟查询操作的吧
2:如果进行了读写分离,同时进行查询操作跟修改操作,那么这个查询操作不会出现脏读现象吗。

5个回答

  1. 不进行读写分离,可以同时进行修改和查询. 但是这个“同时”是需要加双引号的,因为需要看数据库的多个事务的隔离级别。 多个事务同时进行的时候,为了防止互相干扰,数据库有隔离级别。
  2. 如果进行了读写分离,是否会脏读 答案是会,但是概率非常低,计算机科学没有完美的解决方案,许多方案只是出错概率低而已。 读写分离,那么写库的数据变化,需要及时同步到读库(从库), 一般情况下,数据文件的同步比查询快的多, 数据延迟没有那么严重,基本都是秒级的,可能两个请求来回,数据就已经同步好。不会出现脏读的情况, 但是在一些特殊的场景下,比如网络抖动,新加字段,可能数据同步延迟会变大, 此时master slave的数据会出现不一致,如果insert/update/delete后立刻select, 就有可能读不到或者脏读。所以具体把读写分离放在哪一层,以及数据同步的优先级和策略, 写库发生变更部分的那一部分数据,从库是否需要加读锁等方案,都要根据业务类型和实际情况来决定。 再说一遍,许多问题没有完美的方案,只有合适的方案

写也是要先读才能写,读写分离是指并发量大的情况,大量的读,如报表,要耗时,会影响要其他的写操作,所以要分离出大量的读操作。

补充一点啊,其实脏读这个概念,用在你上面的业务场景中,是不恰当的。
脏读(事务A尚未提交的数据,被B事务读到了,就叫脏读)
张无忌账户余额为0。
A事务(张无忌存款事务):更新张无忌账户余额为100元,但尚未提交
B事务(张无忌女朋友去取款的事务),读取到张无忌存款操作尚未提交的数据(账户余额有100元,张无忌女朋友成功取款)

A事务失败回滚了(突然停电了,张无忌存款的钱被取款机吐出,存款失败)。

可以看出,你上面列举的读写分离的脏读概念,和真正的脏读概念,不是一回事啊,我上面回答的时候,认同了你的脏读的概念,不好意思。

再说一下, 其实你的意思是: 写库的数据还没同步到从库来,这个时候从库查询的数据是变化之前的,数据不一致了。
问题的本质是: t这个时刻,我的查询得到的数据,是否是T时刻真正的数据,如果读取的是T时刻早一点时间的数据,就是你说的那个“脏读”。
那其实又回到了事务隔离的问题,如果写和读是同一个业务逻辑的代码,你不可能不知道你写的是啥。
如果写的逻辑和读的逻辑不是同一个业务逻辑,就算是同一个数据库,难道不会发生你说的那个"脏读"场景么?
比如:你在13:01:001成功查询到数据,然后处理。 我在13:01:002插入数据了,你读取的数据也是我变更之前的。
和读写分离的问题的唯一区别在于:没有读写分离的时候,你在13:01:001成功查询到数据,确实就是13:01:001的时候的数据状态。
有读写分离的时候,如果发生数据同步延迟,你在13:01:001成功查询到数据,可能是数据库里面13:00:000的数据。
这种问题的解决,感觉应该是柔性事务或者逻辑层面需要控制的吧。
我也是文科生小白一枚,纯属乱说,欢迎指正。

StackTc
StackTc 读库 读到到数据未必是最新的,因为写库写进去的时候 要同步到读,所以这里可能会有问题。还未同步的时候 读的数据就不是最新的
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐