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

最新网站建设的模板建站宝盒后台

最新网站建设的模板,建站宝盒后台,百度学术搜索入口,自己做的网站有排名吗目录 业务场景 业务问题&#xff1a; 数据库表设计&#xff1a; like&#xff08;关注表&#xff09;&#xff1a; friend&#xff08;朋友表&#xff09; 并发场景下&#xff0c;SQL语句执行逻辑 比较 A 和 B 的大小&#xff0c;如果 A执行下面的逻辑&#xff1a;<&…

目录

业务场景

业务问题:

数据库表设计:

like(关注表):

friend(朋友表) 

并发场景下,SQL语句执行逻辑

比较 A 和 B 的大小,如果 A执行下面的逻辑:<>

如果 A>B,则执行下面的逻辑:

SQL写法详解:

参考内容:


业务场景

业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。

业务问题:

在并发场景下,同时有两个人,设置为关注对方,就可能导致无法成功加为朋友关系。如下:

session(a喜欢b)session(b喜欢a)

begin;

select * from friend_like where user_id = B andliker_id = A;(返回空)

begin;

select * from  friend_like where user_id = B andliker_id = A;(返回空)

insert into  friend_like  (user_id, liker_id) values(B,A);
insert into  friend_like  (user_id, liker_id) values(A,B);
commit;
commit;

数据库表设计:

like(关注表):

CREATE TABLE `friend_like` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL,`liker_id` int(11) NOT NULL,`relation_ship` int(11) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `uk_user_id_liker_id` (`user_id`,`liker_id`)
) ENGINE=InnoDB;

friend(朋友表) 

CREATE TABLE `friend` (`id` int(11) NOT NULL AUTO_INCREMENT,`friend_1_id` int(11) NOT NULL,`friend_2_id` int(11) NOT NULL,UNIQUE KEY `uk_friend` (`friend_1_id`,`friend_2_id`),PRIMARY KEY (`id`)
) ENGINE=InnoDB;

 relation_ship: 

1,表示 user id 关注 liker id;

2,表示liker id 关注 user id;

3,表示互相关注。

并发场景下,SQL语句执行逻辑

比较 A 和 B 的大小,如果 A<B执行下面的逻辑:

begin; /*启动事务*/
insert into `like`(user_id, liker_id, relation_ship) values(A, B, 1) on duplicate key update relation_ship=relation_ship | 1;
select relation_ship from `like` where user_id=A and liker_id=B;
/*代码中判断返回的 relation_ship,如果是1,事务结束,执行 commit如果是3,则执行下面这两个语句:*/
insert ignore into friend(friend_1_id, friend_2_id) values(A,B);
commit;/*提交事务*/

如果 A>B,则执行下面的逻辑:

begin; /*启动事务*/
insert into `like`(user_id, liker_id, relation_ship) values(B, A, 2) on duplicate key update relation_ship=relation_ship | 2;
select relation_ship from `like` where user_id=B and liker_id=A;
/*代码中判断返回的 relation_ship,如果是2,事务结束,执行 commit如果是3,则执行下面这两个语句:
*/
insert ignore into friend(friend_1_id, friend_2_id) values(B,A);
commit;

SQL写法详解:

这个设计里,让“friend_like”表里的数据保证 user id < liker id,这样不论是A关注B,还是B关注A,在操作“like”表的时候,如果反向的关系已经存在,就会出现行锁冲突
然后,insert...on duplicate 语句,确保了在事务内部,执行了这个 SQL语句后,就强行占住了这个行锁,之后的 select 判断 relation ship 这个逻辑时就确保了是在行锁保护下的读操作。
操作符“|” 是按位或,连同最后一句 insert 语句里的 ignore,是为了保证重复调用时的幂等性
这样,即使在双方“同时”执行关注操作,最终数据库里的结果,也是 like 表里面有一条关于 A和B的记录,而且 relation ship 的值是3,并且 friend 表里面也有了A和B的这条记录。

参考内容:

15 | 答疑文章(一):日志和索引相关问题 (geekbang.org)

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

相关文章:

  • 山东网站建设SEO优化制作设计公司淘宝网首页官网电脑版
  • 制作网站在哪里临沂网站建
  • 有网址 有空间怎么做网站国外做二手服装网站
  • 连锁公司网站源码建设网站的申请信用卡
  • 企业网站个人备案企业网站更新什么内容
  • 门户网站建设工作制作和淘宝商城一样网站
  • 模板王网站官网wordpress热门吗
  • 昆山企业网站建设wordpress 页面 跳转
  • 台州建设企业网站网站设计模板下载
  • 个人网站的设计师wordpress免费申请
  • 网站快排是怎么做的聊城网站营销
  • 文山城乡建设部网站首页邯郸市魏县建设局网站
  • 西安免费做网站哪家好网站空间的管理
  • 外贸网站制作需求公司做网站广告语
  • 质感设计网站阿里云有了域名 网站建设
  • intitle:做网站平台运营推广
  • 手机app与电脑网站的区别上海中风险地区名单
  • 温州开发网站公司哪家好网站开发运营费用
  • 网站建设服务多少钱做ppt的动图下载哪些网站
  • 电商网站建设价格低公司推广网站建设话术
  • 莆田市建设局网站中山微信网站
  • iis怎么创建网站企业软件项目管理系统
  • 外贸网站导航栏建设技巧怎么编辑网站内容
  • 网站建设属于高新技术收入吗注册城乡规划师一年能挂多少钱
  • 网站建设资料总结网页图片自动轮换
  • 网站建设引领者Wordpress 报表的插件
  • 网站有免费的域名和空间么乌市建设工程质量监督站网站
  • 网站开发项目经理可免费注册的网站
  • 什么是展示型网站建设阿里快速建站
  • 做网站编辑有什么发展wordpress详细介绍