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

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 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。
  • ¥15 已知隐函数其中一个变量τ的具体值,求另一个变量
  • ¥15 r语言Hurst指数