当前位置: 首页 > news >正文

余江网站建设前端微信公众号开发

余江网站建设,前端微信公众号开发,苏州seo排名外包,html5响应式公司网站模版mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资…

mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁

MySQL锁概述

锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。


一、乐观锁(Optimistic Lock)

MySQL中的乐观锁主要通过CAS的机制来实现,一般通过version版本号来实现。

CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

比如扣减库存问题,通过乐观锁可以实现如下:

//查询出商品信息,storeNum = 10
select storeNum from items where id=1
//根据商品信息生成订单
//修改商品storeNum为2
update items set storeNum=2 where id=1 and storeNum = 10;

我们在更新之前,先查询一下库存表中当前库存数(storeNum),然后在做update的时候,以库存数作为一个修改条件。当我们提交更新的时候,判断数据库表对应记录的当前库存数与第一次取出来的库存数进行比对,如果数据库表当前库存数与第一次取出来的库存数相等,则予以更新,否则认为是过期数据。


二、悲观锁(Pessimistic Lock)

​ 悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

悲观锁的流程:

  • 在对记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。

  • 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。具体响应方式由开发者根据实际需要决定。

  • 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。

  • 其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。

比如淘宝下单过程中扣减库存的需求说明一下如何使用悲观锁:

//0.开始事务
begin; 
//1.查询出商品信息
select storeNum from items where id=1 for update;
//2.修改商品storeNum 为2
update items set storeNum=2 where id = 1;
//3.提交事务
commit;

在对id = 1的记录修改前,先通过for update的方式进行加锁,然后再进行修改。这就是比较典型的悲观锁策略。

如果以上修改库存的代码发生并发,同一时间只有一个线程可以开启事务并获得id=1的锁,其它的事务必须等本次事务提交之后才能执行。这样可以保证当前的数据不会被其它事务修改。

上面提到,使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引的话,优化器在选择时候,如果发现锁表可能性能更好的话,有可能会直接锁表。


三、表级锁(Table-level lock)

直接给整个添加锁:

select storeNum from items where name='王五周八' for update;

InnoDB在使用过程中只要不通过索引检索数据时,全部是表锁。
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。


四、行级锁(record Locks)

使用InnoDB中给添加指定的添加锁:

select storeNum from items where id>10 for update;

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点,MySQL于Oracle不同,后者是通过在数据块中对相应的数据行加锁来实现的,InnoDB只有通过索引条件检索数据,InnoDB才使用行级锁
行锁的劣势:开销大;加锁慢;会出现死锁
行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强


五、共享锁(share lock)

共享锁:又称读锁,允许一个事务去读取一行,阻止其他事务获得相同数据集的排它锁,若事务T对数据对象A加上S锁,则事务T可以读A,但不能修改A,其他事务只能对再对A加S锁,而不能加X锁,直到T释放A上的锁,这保证了其他事务可以读A,但在释放A上的S锁之前不能对A做任何修改。


六、排他锁(exclusive lock)

排它锁:又称写锁,允许获取排它锁的事物更新数据,阻止其他事务取得相同的数据集共享读锁和排它写锁,若事务T对数据对象A加上X锁,事物T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T 释放A上的锁

http://www.yayakq.cn/news/851359/

相关文章:

  • 网站开发网页制作薪资南山做网站多少钱
  • 网站建设案例 算命网站免费域名注册永久阿里云
  • 陕西省建设监理协会网站成绩查询南宁微网站开发
  • 网站建设分享常用网站大全
  • 建一个网站多少钱?网站建设介绍ppt模板下载
  • 设计网站一般多少钱招商外包
  • 建设网站的书籍怎么下学做衣服网站
  • 微网站素材山东移动网站建设
  • 自己做网站打不开是怎么回事企业网站建设存在的问题及建议
  • 北京cms建站系统dz做分类网站
  • 网页设计素材站东营网站建设服务商
  • 平顶山 网站设计网络广告四个特征
  • 装修网站大全wordpress发布时间格式
  • 网络推广方案怎么做东莞推广seo关键词排名优化
  • 金融公司网站设计图盲盒小程序加盟
  • 自助建站实验报告重庆市建设工程信息网上查询
  • 成都网站建设好的公司上海贸易公司有哪些
  • wordpress调用站点标题wordpress 路由规则
  • 网站生成海报功能怎么做seo短视频网页入口引流网站推荐
  • 网站建设属于什么科目红安建设局投诉网站
  • 如何创造一个自己的网站企业怎样建网站
  • 青岛低价网站建设合肥有没有做网站的单位
  • 淘宝客推广怎么做网站备案太原制作微信网站
  • 半路出家去学计算机网站开发wordpress 侵权
  • 免费做暧暧网站sem是什么牌子
  • 网站运营与管理论文手机百度免费下载
  • 营销式网站建设公司怎么解决
  • 电子商务网站建设第三章答案做网站工作都包括什么
  • 建设官网的网站首页ih5 做视频网站
  • 重庆微网站建设前端开发就是做网站吗