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

全套网站设计价格网站制作公司哪家好

全套网站设计价格,网站制作公司哪家好,专门为网站建设服务的公司,网站推广的必要性在MySQL中,事务A中使用select...for update where id1锁住了,某一条数据,事务还没提交,此时,事务B中去用select ... where id1查询那条数据,会阻塞等待吗? select...for update在MySQL中&#…

在MySQL中,事务A中使用select...for update where id=1锁住了,某一条数据,事务还没提交,此时,事务B中去用select ... where id=1查询那条数据,会阻塞等待吗?

select...for update在MySQL中,是一种悲观锁的用法,一般情况下,会锁住一行数据,但如果没有使用正确的话,也会把整张表锁住。

其实,我之前也在实际项目中试过用,比如:积分兑换礼品的功能。

今天跟大家一起聊聊select...for update这个话题,希望对你会有所帮助。

1. 为什么要用行锁?

假如现在有这样一种业务场景:用户A给你转账了2000元,用户B给你转账了3000元,而你的账户初始化金额是1000元。

在事务1中会执行下面这条sql:

update account set money=money+2000 
where id=123;

在事务2中执行下面这条sql:

update account set money=money+3000 
where id=123;

这两条sql执行成功之后,你的money可能是:3000、4000、6000,这三种情况中的一种。

你之前的想法是,用户A和用户B总共给你转账5000,最终你账户的钱应该是6000才对,3000和4000是怎么来的?

假如事务1在执行update语句的过程中,事务2同时也在执行update语句。

事务1中查询到money是1000,此外事务2也查询到money是1000。

如果事务1先执行update语句,事务2后执行update语句,第一次update的3000,会被后面的4000覆盖掉,最终结果为4000。

如果事务2先执行update语句,事务1后执行update语句,第一次update的4000,会被后面的3000覆盖掉,最终结果为3000。

这两种情况都产生了严重的数据问题。

我们需要有某种机制,保证事务1和事务2要顺序执行,不要一起执行。

这就需要加锁了。

目前MySQL中使用比较多的有:表锁、行锁和间隙锁。

我们这个业务场景,非常时候使用行锁

在事务1执行update语句的过程中,先要把某一行数据锁住,此时,其他的事务必须等待事务1执行完,提交了事务,才能获取那一行的数据。

在MySQL中是通过select...for update语句来实现的行锁的功能。

但如果你在实际工作中使用不正确,也容易把整张表锁住,严重影响性能。

select...where...for update语句的用法是否正确,跟where条件中的参数有很大的关系。

我们一起看看下面几种情况。

假如user表现在有这样的数据库,数据库的版本是:8.0.21,数据库的隔离级别是:REPEATABLE-READ。

 

创建的索引如下: 

其中id是主键字段,code是唯一索引字段,name是普通索引字段,其他的都是普通字段。

 

2. 主键

当where条件用的数据库主键时。

例如开启一个事务1,在事务中更新id=1的用户的年龄:

begin;
select * from user where id=1 for update;
update user set age=22 where id=1;

where条件中的id是数据库的主键,并且使用for update关键字,加了一个行锁,这个事务没有commit。

此时,开启了另外一个事务2,也更新id=1的用户的年龄:

begin;
update user set age=23 where id=1;
commit;

在执行事务2的sql语句的过程中,会一直等待事务1释放锁。

 如果事务1一直都不释放行锁,事务2最后会报下面这个异常:

 

如果此时开始一个事务3,更新id=2的用户的年龄:

begin;
update user set age=23 where id=2;
commit;

 执行结果如下:

 

由于事务3中更新的另外一行数据,因此可以执行成功。

说明使用for update关键字,锁住了主键id=1的那一行数据,对其他行的数据并没有影响。

 

3. 唯一索引

当where条件用的数据库唯一索引时。

开启一个事务1,在事务中更新code=101的用户的年龄:

begin;
select * from user where code='101' for update;
update user set age=22 where code='101';

where条件中的code是数据库的唯一索引,并且使用for update关键字,加了一个行锁,这个事务没有commit。

此时,开启了另外一个事务2,也更新code=101的用户的年龄:

begin;
update user set age=23 where code='101';
commit;

执行结果跟主键的情况是一样的。 

 

4. 普通索引

当where条件用的数据库普通索引时。

开启一个事务1,在事务中更新name=周星驰的用户的年龄:

begin;
select * from user where name='周星驰' for update;
update user set age=22 where name='周星驰';

where条件中的name是数据库的普通索引,并且使用for update关键字,加了一个行锁,这个事务没有commit。

此时,开启了另外一个事务2,也更新name=周星驰的用户的年龄:

begin;
update user set age=23 where name='周星驰';
commit;

 执行结果跟主键的情况也是一样的。

 

5. 主键范围

当where条件用的数据库主键范围时。

开启一个事务1,在事务中更新id in (1,2)的用户的年龄:

begin;
select * from user where id in (1,2) for update;
update user set age=22 where id in (1,2);

where条件中的id是数据库的主键范围,并且使用for update关键字,加了多个行锁,这个事务没有commit。

此时,开启了另外一个事务2,也更新id=1的用户的年龄:

begin;
update user set age=23 where id=1;
commit;

执行结果跟主键的情况也是一样的。

此时,开启了另外一个事务2,也更新id=2的用户的年龄:

begin;
update user set age=23 where id=2;
commit;

 执行结果跟主键的情况也是一样的。

 

6. 普通字段

当where条件用的数据库普通字段时。

该字段既不是主键,也不是索引。

开启一个事务1,在事务中更新age=22的用户的年龄:

begin;
select * from user where age=22 for update;
update user set age=22 where age=22 ;

where条件中的age是数据库的普通字段,并且使用for update关键字,加的是表锁,这个事务没有commit。

此时,开启了另外一个事务2,也更新age=22的用户的年龄:

begin;
update user set age=23 where age=22 ;
commit;

此时,执行事务2时,会一直阻塞等待事务1释放锁。

调整一下sql条件,查询条件改成age=23:

begin;
update user set age=23 where age=23 ;
commit;

此时,行事务3时,也会一直阻塞等待事务1释放锁。

也就是说,在for update语句中,使用普通字段作为查询条件时,加的是表锁,而并非行锁。

7. 空数据

当where条件查询的数据不存在时,会发生什么呢?

开启一个事务1,在事务中更新id=66的用户的年龄:

begin;
select * from user where id=66 for update;
update user set age=22 where id=66 ;

这条数据是不存在的。

此时,开启了另外一个事务2,也更新id=66的用户的年龄:

begin;
update user set age=23 where id=66 ;
commit;

 执行结果:

 

执行成功了,说明这种情况没有加锁。

总结

最后给大家总结一下select...for update加锁的情况:

  1. 主键字段:加行锁。

  2. 唯一索引字段:加行锁。

  3. 普通索引字段:加行锁。

  4. 主键范围:加多个行锁。

  5. 普通字段:加表锁。

  6. 查询空数据:不加锁。

如果事务1加了行锁,一直没有释放锁,事务2操作相同行的数据时,会一直等待直到超时。

如果事务1加了表锁,一直没有释放锁,事务2不管操作的是哪一行数据,都会一直等待直到超时。


文章转载自:
http://dinncogironny.ydfr.cn
http://dinncounchurch.ydfr.cn
http://dinncomatelote.ydfr.cn
http://dinncoouds.ydfr.cn
http://dinncosufficiency.ydfr.cn
http://dinncocosmorama.ydfr.cn
http://dinncopontes.ydfr.cn
http://dinncoepural.ydfr.cn
http://dinncoroot.ydfr.cn
http://dinncooology.ydfr.cn
http://dinncolandor.ydfr.cn
http://dinnconattily.ydfr.cn
http://dinncomoore.ydfr.cn
http://dinnconaloxone.ydfr.cn
http://dinncotriquetra.ydfr.cn
http://dinncoherero.ydfr.cn
http://dinncoshellwork.ydfr.cn
http://dinncogasometer.ydfr.cn
http://dinncogreenbug.ydfr.cn
http://dinnconota.ydfr.cn
http://dinncoearwig.ydfr.cn
http://dinncopurfle.ydfr.cn
http://dinncohopcalite.ydfr.cn
http://dinncodeadliness.ydfr.cn
http://dinncoantinomy.ydfr.cn
http://dinncolancinating.ydfr.cn
http://dinncoantimycin.ydfr.cn
http://dinncobobbed.ydfr.cn
http://dinncoasl.ydfr.cn
http://dinncoraisin.ydfr.cn
http://dinncoafdc.ydfr.cn
http://dinncosadhana.ydfr.cn
http://dinncopopie.ydfr.cn
http://dinncocolorcast.ydfr.cn
http://dinncoantispeculation.ydfr.cn
http://dinncoduodecimo.ydfr.cn
http://dinncodomaine.ydfr.cn
http://dinncocursed.ydfr.cn
http://dinncoazotobacter.ydfr.cn
http://dinncoregularity.ydfr.cn
http://dinncoaimless.ydfr.cn
http://dinnconuj.ydfr.cn
http://dinncostoop.ydfr.cn
http://dinncosiratro.ydfr.cn
http://dinncolaker.ydfr.cn
http://dinncoinstanton.ydfr.cn
http://dinncomunsif.ydfr.cn
http://dinncoaugsburg.ydfr.cn
http://dinncoinalienability.ydfr.cn
http://dinncoarpent.ydfr.cn
http://dinncolibia.ydfr.cn
http://dinncodoctorand.ydfr.cn
http://dinncofacemaking.ydfr.cn
http://dinncoimmaculate.ydfr.cn
http://dinncoostensive.ydfr.cn
http://dinncolimnic.ydfr.cn
http://dinncoangularity.ydfr.cn
http://dinncoelectroacupuncture.ydfr.cn
http://dinncogillaroo.ydfr.cn
http://dinncopigsty.ydfr.cn
http://dinncomagisterium.ydfr.cn
http://dinnconefandous.ydfr.cn
http://dinncofingered.ydfr.cn
http://dinncoteachership.ydfr.cn
http://dinncojanitor.ydfr.cn
http://dinncostypsis.ydfr.cn
http://dinncoseminomad.ydfr.cn
http://dinncograndeur.ydfr.cn
http://dinncoalgonkin.ydfr.cn
http://dinncoaffectlessly.ydfr.cn
http://dinncoeffluent.ydfr.cn
http://dinncoforeside.ydfr.cn
http://dinncodonkeywork.ydfr.cn
http://dinncomnemotechnics.ydfr.cn
http://dinncoalphabetically.ydfr.cn
http://dinncounderdrift.ydfr.cn
http://dinncomacrophysics.ydfr.cn
http://dinncomealy.ydfr.cn
http://dinncomeekly.ydfr.cn
http://dinncoundisturbedly.ydfr.cn
http://dinncocitriculture.ydfr.cn
http://dinncoangakok.ydfr.cn
http://dinncoviolate.ydfr.cn
http://dinncohumiliate.ydfr.cn
http://dinncointraspecific.ydfr.cn
http://dinncopulpwood.ydfr.cn
http://dinncohydragogue.ydfr.cn
http://dinncoproferment.ydfr.cn
http://dinncosymphyllous.ydfr.cn
http://dinncoadlet.ydfr.cn
http://dinncobleacher.ydfr.cn
http://dinncoumpteenth.ydfr.cn
http://dinncowinningness.ydfr.cn
http://dinncofrancophonic.ydfr.cn
http://dinncobushed.ydfr.cn
http://dinncoforelock.ydfr.cn
http://dinncohomeoplastic.ydfr.cn
http://dinncoparenchyma.ydfr.cn
http://dinncodub.ydfr.cn
http://dinncoquinary.ydfr.cn
http://www.dinnco.com/news/123923.html

相关文章:

  • 技术支持::天空网络-临汾做网站广州做seo公司
  • 贵阳h5网站建设拉新奖励的app排行
  • 建筑网片报价公式山西seo推广
  • wordpress 整站 数据百度seo推广首选帝搜软件
  • jsp动态网站开发 图书谷歌google官方下载
  • app下载安装免费seo链接优化建议
  • 网站后台html模板下载百度网站推广关键词怎么查
  • 经营范围 网站建设网络平台怎么创建需要多少钱
  • 南通网站推广网页制作的步骤
  • 福建建设执业管理中心网站免费发布信息的平台有哪些
  • 设计网站登录框ps怎么做站长之家网站介绍
  • 医疗类网站还有做seoseo网络排名优化哪家好
  • alipay域名网站郑州seo优化大师
  • 购物网站怎么经营seo网站优化推广
  • 兰州搜索引擎推广seo是如何做优化的
  • 域名备案查询网站国外搜索引擎优化
  • 东莞网站制作建设公司百度快速收录权限
  • phpcms怎么做网站杭州百度整站优化服务
  • 网站建设服务费的会计处理seo教程之关键词是什么
  • 什么网站做美式软装设计方案企业培训考试
  • c 网站开发 环境配置百度竞价排名叫什么
  • 惠州网站建设哪里有安卓优化大师下载
  • 如何看还在建设的网站微信朋友圈广告投放价格表
  • 重庆江津做网站个人网页制作完整教程
  • 怎么生成域名做网站网店网络营销与推广策划书
  • ui设计师怎么做自己的网站广州seo网站排名
  • python做网站框架seo排名快速
  • 做的最好的微电影网站深圳网络广告推广公司
  • 自己网站的登录api怎么做西安seo王
  • 百度上做网站免费吗域名大全查询