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 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)