aba问题mysql_Mysql中select + update并发更新问题
一开始想的解决方案:
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并发更新问题相关推荐
- mysql同时更新2个表_mysql中同时update更新多个表
本节内容: 在mysql数据库中实现update同时更新多个表. 1,同时更新的多个表之间无联系统 复制代码 代码示例: update table1 t1,table2 t2 set t1.a=1,t ...
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测
我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录每个字段原来的值和更新时的值进行对比,如果稍有不同则意味着记录被修改过,因此产生了更新冲突.不过您是否有这样的感觉,这种方 ...
- ACCESS中的Update语句不支持Select的解决办法
ACCESS中的Update语句不支持Select的解决办法执行 比如ACCESS中执行SQL语句: UPDATE HN_news AS a SET typeid = (select clid fro ...
- 转-LR中select next row和update value on的设置
LR中select next row和update value on的设置 LR的参数的取值,和select next row和update value on的设置都有密不可分的关系.下表给出了sel ...
- 数据库中Select For update语句的解析
----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...
- oracled update_oracle中要谨慎使用update交叉更新!
在oracle中使用update进行交叉更新时一直都觉得很不方便,当然这是和sql server or sybase相比较而言的.[@more@] SQL> select *from a1; I ...
- Oracle数据库之oracle update set select from 关联更新
本文主要向大家介绍了Oracle数据库之oracle update set select from 关联更新,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 工作中有个需求,现在 ...
- 【转】MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- python update函数会调用哪些内置函数_Python字典的内置函数中没有 append()操作,可以用 update()来更新字典内容...
Python字典的内置函数中没有 append()操作,可以用 update()来更新字典内容 答:√ 在同一代昭穆的兄弟中,以年岁序位. 答:对 <舆服志>主要描写了唐代的流行服饰样式, ...
- MyBatis中@Insert,@Select,@Update,@Delect的使用
实习中遇到了一个神奇的组件:MyBatis中的@Insert,@Select,@Update,@Delect 在实际开发生产中可以直接在dao层的实现类中添加注解,即可实现我们想要的增删改查操作: 代 ...
最新文章
- [M]MagicTable转换异常解决方法
- 对表单控制是否提交 需要在方法名前面加上 return
- 正则表达式中模式修正符作用详解(i、g、m、s、x、e)
- u3d文件上传至服务器,unity 上传图片到云服务器
- 疯子的算法总结11--次小生成树+严格次小生成树
- 新单词 part 4
- java学习(11):Java数据类型转换
- PyTorch 1.0 中文文档:torch.cuda
- 简洁/易用/灵活/高效-RecyclerView适配器封装
- BZOJ2555:SubString(SAM,LCT)
- 3mx转osgb_如何将无人机Las点云数据转为Osgb数据
- 关于用KMS的时候手欠把原装正版win11的激活卸载了怎么办
- 研发管理02----嵌入式硬件设计流程之完善
- 通感一体化学习笔记(1)——匹配滤波与脉冲压缩
- 微信商户平台如何下载证书和设置KEY值?
- Day12:使用正则表达式
- python 写入Excel
- 怎么重置imac_[重置系统]如何重置Mac电脑到出厂状态
- 20.番外篇——Vue如何自定义组件并且进行全局配置
- Debug与Release版本的区别