一开始想的解决方案:

A、把select和update合并成一条sql

B、事务,用同一个事务包裹select+update的操作。

分析:并不是包上事务就万事大吉。因为如果同时有两个事务都分别select到了相同的记录,那么一样会发生有一方的更新会失败的问题。然后我再想到把事务的隔离级别设置为serializable,但是考虑到性能显然不现实。

我们知道innodb是支持行锁的,然后我就去查看看他的几种锁:读共享锁和写独占锁。

? 读共享锁

是通过SQL的LOCK IN SHARE MODE,例:

Select * from parent where name =‘jones’LOCK IN SHARE MODE;

如果事务A先获得了读共享锁,那么事务B仍然可以做读操作。但是必须等事务A commit或者roll back之后才可以更新或者删除加了读共享锁的行数据。-----但是这种锁并解决不了我们的问题,因为我们应该要再查询的时候就查到事务A commit或者roll back后的数据才是,才是数据别更新后的最新数据。

------如果想要解决上面的并发问题,采用读共享锁是不可以解决的

? 写独占锁

通过SQL的select…for update获得,例:

Select xxx from xxx for update;

Update xxx set xxx = #{xxx};

如果事务A先获得了某行写共享锁,那么事务B就必须等待事务A commit或者roll back之后才可以访问数据。

------如果想要解决上面的并发问题,采用写独占锁是可以解决的

另外这里特别提醒下:UPDATE/DELETE SQL尽量带上WHERE条件并在WHERE条件中设定索引过滤条件,否则会锁表,性能可想而知有多差了。因为

MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

但是写独占锁是一种悲观锁机制,所以在大佬的指导下还有一种方式,可以避免悲观锁,就是乐观锁!

·乐观锁,类似CAS机制(应该采取的方式)

其实也很简单,首先在select的SQL不作任何修改,然后在update的SQL的where条件中加上select出来的。但是避免不了ABA问题。

aba问题mysql_Mysql中select + update并发更新问题相关推荐

  1. mysql同时更新2个表_mysql中同时update更新多个表

    本节内容: 在mysql数据库中实现update同时更新多个表. 1,同时更新的多个表之间无联系统 复制代码 代码示例: update table1 t1,table2 t2 set t1.a=1,t ...

  2. 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测

    我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录每个字段原来的值和更新时的值进行对比,如果稍有不同则意味着记录被修改过,因此产生了更新冲突.不过您是否有这样的感觉,这种方 ...

  3. ACCESS中的Update语句不支持Select的解决办法

    ACCESS中的Update语句不支持Select的解决办法执行 比如ACCESS中执行SQL语句: UPDATE HN_news AS a SET typeid = (select clid fro ...

  4. 转-LR中select next row和update value on的设置

    LR中select next row和update value on的设置 LR的参数的取值,和select next row和update value on的设置都有密不可分的关系.下表给出了sel ...

  5. 数据库中Select For update语句的解析

    ----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...

  6. oracled update_oracle中要谨慎使用update交叉更新!

    在oracle中使用update进行交叉更新时一直都觉得很不方便,当然这是和sql server or sybase相比较而言的.[@more@] SQL> select *from a1; I ...

  7. Oracle数据库之oracle update set select from 关联更新

    本文主要向大家介绍了Oracle数据库之oracle update set select from 关联更新,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 工作中有个需求,现在 ...

  8. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  9. python update函数会调用哪些内置函数_Python字典的内置函数中没有 append()操作,可以用 update()来更新字典内容...

    Python字典的内置函数中没有 append()操作,可以用 update()来更新字典内容 答:√ 在同一代昭穆的兄弟中,以年岁序位. 答:对 <舆服志>主要描写了唐代的流行服饰样式, ...

  10. MyBatis中@Insert,@Select,@Update,@Delect的使用

    实习中遇到了一个神奇的组件:MyBatis中的@Insert,@Select,@Update,@Delect 在实际开发生产中可以直接在dao层的实现类中添加注解,即可实现我们想要的增删改查操作: 代 ...

最新文章

  1. [M]MagicTable转换异常解决方法
  2. 对表单控制是否提交 需要在方法名前面加上 return
  3. 正则表达式中模式修正符作用详解(i、g、m、s、x、e)
  4. u3d文件上传至服务器,unity 上传图片到云服务器
  5. 疯子的算法总结11--次小生成树+严格次小生成树
  6. 新单词 part 4
  7. java学习(11):Java数据类型转换
  8. PyTorch 1.0 中文文档:torch.cuda
  9. 简洁/易用/灵活/高效-RecyclerView适配器封装
  10. BZOJ2555:SubString(SAM,LCT)
  11. 3mx转osgb_如何将无人机Las点云数据转为Osgb数据
  12. 关于用KMS的时候手欠把原装正版win11的激活卸载了怎么办
  13. 研发管理02----嵌入式硬件设计流程之完善
  14. 通感一体化学习笔记(1)——匹配滤波与脉冲压缩
  15. 微信商户平台如何下载证书和设置KEY值?
  16. Day12:使用正则表达式
  17. python 写入Excel
  18. 怎么重置imac_[重置系统]如何重置Mac电脑到出厂状态
  19. 20.番外篇——Vue如何自定义组件并且进行全局配置
  20. Debug与Release版本的区别

热门文章

  1. jquery ui accordion的详细参数
  2. 跟据URL来实现WebService
  3. 第三季-第26课-守护进程设计
  4. C++--第26课 - 异常处理 - 下
  5. java提高篇(四)-----抽象类与接口
  6. 聊天室自动滚动效果实现
  7. 快速学习django
  8. html标签元素分类
  9. [导入]网络安全工作者的必杀技
  10. Java基础教程——字节流