详解mysql的锁机制


这段时间一直在学习mysql数据库。项目组一直用的是oracle,所以对mysql的了解也不深。本文主要是对mysql锁的总结。

详解mysql的锁机制

Mysql的锁主要分为3大类:

表级锁:存储引擎为Myisam。锁住整个表,特点是开销小,加锁快,锁定力度大,发生锁冲突的概率最高,并发度最低。

页级锁:存储引擎为BDB。锁住某一页的数据(16kb左右),特点:开销和枷锁时间介于表级和行级之间;会出现死锁,锁定力度介于表锁和行锁之间,并发度一般。

行级锁:存储引擎为innodb。锁住某一行的数据,特点:锁的实现更加复杂,开销大,加锁速度慢。

根据以上特点,仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

接下来进行行级锁的详解,行级锁主要分为以下7类:共享/排他锁、意向锁、记录锁、间隙锁、临建锁、插入意向锁、自增锁。

共享/排他锁:

共享锁:又称读锁,可以允许读,但不能写。共享锁可以与共享锁一起使用。语句:

select ... lock in share mode

排他锁:又称写锁,不能允许读,也不能允许写,排他锁不能与其他所一起使用。语句:

select ... for update

mysql中,updatedeleteinsertalter这些写的操作默认都会加上排他锁。Select默认不会加任何锁类型。一旦写数据的任务没有完成,数据是不能被其他任务读取的,这对并发操作有较大的影响。

意向锁:innoDB为了支持多粒度的锁,即允许行级锁和表级锁共存,而引入意向锁。意向锁是指未来的某个时刻,事务可能要加共享/排他锁,先提前声明一个意向。这样如果有人尝试对全表进行修改,就不需要判断表中的数据是否被加锁了,只需要通过等待意向互斥锁被释放就行了。

   意向共享锁(IS):事务想要在获得表中某些记录的共享锁,需要在表上先加意向共享锁。

   意向互斥锁(IX):事务想要在获得表中某些记录的互斥锁,需要在表上先加意向互斥锁。

意向锁其实不会阻塞全表扫描之外的任何请求,它们的主要目的是为了表示是否有人请求锁定表中的某一行数据。

  记录锁(RS):单个行记录上的锁。记录锁总是会锁住索引记录,如果innoDB存储引擎表

在建立的时候没有设置任何一个索引,那么innoDB存储引擎会使用隐式的主键来进行锁定。

间隙锁(GR):间隙锁锁住记录中的间隔,即范围查询的记录。

 Select * From user where id between 1 and 10 for update

这个脚本会锁住110 的数据,以防止其他事务修改该区间的记录;

间隙锁的主要目的,就是为了防止其他事务在间隔中插入数据,以导致“不可重复读”。如果把事务的隔离级别降级为读提交(Read Committed, RC),间隙锁则会自动失效

飞蛙B2C微分销商城系统 飞蛙B2C微分销商城系统

飞蛙微分销商城系统(FeiWa WeiShop)是一款面向单店铺多用户微商城分销系统,基于目前最流行的WEB2.0的架构,使用php+mysql开发框架,系统全面导入整合最流行的三级分销机制。开发团队拥有成熟、稳定的微电商技术解决方案,是为了快速简化企业微商城应用开发、帮助微商企业快速赚钱而诞生的。

飞蛙B2C微分销商城系统 0 查看详情 飞蛙B2C微分销商城系统

临建锁(next-key Locks):临建锁是记录锁和间隙锁的组合,锁的范围既包含记录又包含索引区间。默认情况下,innoDB使用临建锁来锁定记录。但当查询的索引含有唯一属性的时候,临建锁会进行优化,将其降级为记录锁,即仅锁住索引本身,不是范围。

临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。

插入意向锁(insert intention locks):对已有数据行的修改和删除,必须加互斥锁,对于数据的插入,加插入意向锁。是专门针对于insert操作的。

自增锁(auto-inc locks):是一种特殊的表级别的锁,专门针对事务插入auto-increment类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。

---------------------------------------------------------分界线--------------------------------------------------------------

接下看讲一下其他的锁:

死锁:产生是因为线程锁之间交替等待产生的。值两个或两个以上的事务在执行过程中,因争夺资源而造成的一种相互等待的现象。

Mysql处理死锁的方法:根据数据写的数据量的大小来回滚小事务。

乐观/悲观锁:

乐观锁:乐观的假定大概率不会发生并发更新冲突,访问,处理数据的过程中不加锁,只在更新数据时根据版本号或时间戳判断是否有冲突,有则处理,无责提交事务。

如果系统并发量非常大,悲观锁会带来非常大的性能问题,选择使用乐观锁,现在大部分应用属于乐观锁

悲观锁:悲观的假定大概率会发生并发更新冲突,访问,处理数据前就加排他锁,在整个数据处理过程中锁定数据,事务提交或回滚后才释放锁。

优点:

悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。

缺点:

a)在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;

b) 在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数

建议:

  1. 控制事务的大小(操作写的数据量)
  2. 使用锁的时候尽量要配合与携带索引的字段使用,避免升级为表锁
  3. 范围查询,尽量减少基于范围查询的事务的大小
  4. 如果业务必须要使用锁,锁的冲突特别高的话,改为表锁
  5. 可以根据项目自身的情况调节事务的innodb_flush_log_at_trx_commit

推荐学习:MySQL教程

以上就是详解mysql的锁机制的详细内容,更多请关注其它相关文章!


# 数据处理  # 北京百度seo专业乐云seo  # 珠海全网seo推广公司  # seo线下培训机构深圳  # 网站怎么推广优联火星  # 党员建设网站  # 扬州关键词搜索排名  # 哪有做网站建设的公司  # 螺蛳粉营销推广  # 阿拉善盟网站推广招商  # 河南哪里有培训seo  # mysql  # 事务处理  # 行数  # 互斥  # 解锁  # 加锁  # 镜像  # 锁住  # 死锁  # 宋体 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《oppo商城》维修服务位置  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  海棠阅读网页版_进入海棠网页版在线阅读中心  苹果SE如何开启单手模式_苹果SE单手操作功能  申通快递物流信息查询 申通快递包裹状态追踪  Go Template中优雅处理循环最后一项:自定义函数实践  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  PHP中获取HTTP响应状态消息:方法与限制  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  Lar*el Socialite单设备登录策略:实现用户唯一会话管理  WooCommerce 新客户订单自动添加管理员备注教程  Vue 3中独立响应式实例的创建与应用  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  阿里云共享相册入口在哪  一点万象签到领积分指南  《大润发优鲜》充值方法介绍  圆通快递官方入口不需要登录 在线查询入口快速查询  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  金牛福袋获取攻略  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  《气泡星球》兑换码礼包大全  mysql如何限制远程访问_mysql远程访问限制方法  《爱笔思画x》涂色教程  Retrofit根路径POST请求:@POST("/") 的应用与解析  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  苹果如何下载nanobanana  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  《百度畅听版》关闭兴趣推荐方法  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法  excel怎么计算平均值 excel平均函数*ERAGE使用教学  DeepSeek超全面指南:入门必看  申通快件单号查询平台 申通包裹物流动态跟踪  实现可重用自定义Python Range类  猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  在Django中动态检查模型关联:一种灵活的解决方案  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  Pandas中基于动态偏移量实现DataFrame列值位移的策略  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  抖音视频如何添加标题?添加标题有哪些好处?  批改网官网首页登录 批改网学生用户登录入口 

 2019-11-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.