huangshuo168 2022-01-05 15:35 采纳率: 100%
浏览 55
已结题

Mysql并发操作同一个表同一个字段问题

遇到多用户操作同一个表的业务,心里有一些不解之处
我知道Mysql多事务间的读写是通过MVCC隔离的,这样保证写操作即使有修改,读操作依旧能读到正确版本号的字段值。
          但是对于多事务的并发修改操作。我很疑惑,Mysql已经是行级锁的前提下,第一个到达的事务不是会锁住行,这样不是已经实现写写分离嘛,为什么还需要再使用版本号version乐观锁机制,甚至有些人会推荐使用Lock table这种消耗大的方式?
我的理解是,日常用的Pgsql,Mysql,Oracle这些常用库,其实在事务级别都已经做了读写分离(MVCC)和写写分离(表锁,行锁),是否需要再次进行锁表操作尼
  • 写回答

2条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-01-05 21:02
    关注

    很多情况下,程序代码去锁数据,不仅仅是为了不让别的会话修改,更多情况下是一种判断,判断这个数据是否正在被别的会话修改,这种操作一般放在一个事务操作的比较靠前的位置,根据加锁是否成功这个步骤,来决定是否需要继续向下执行正常逻辑还是去执行异常逻辑或者等待。
    举例,有时候更新数据,会根据数据当前的值来计算,即先查询再修改,如果它查询的数据其他会话正在修改,等它查完后,其他会话把事务提交了,那么它根据之前数据计算出来的值再更新到这个表就会出现问题,所以它不能先查数据,而是应该先判断有没有人在改数据。
    至于lock table,那是因为insert不会锁(除非有唯一键),要防止记录出现重复。
    实际应用中,应该根据不同的业务逻辑场景,去选择不同的加锁机制,不能一概而论,这个东西不能只看数据库机制层面,还应该去看业务场景及程序代码控制

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog