当前位置: 首页 > 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/597145/

相关文章:

  • 关于网站建设案例我要做电商怎么做
  • 没备案的网站百度收录漯河网站开发
  • 绍兴网站网站建设网页链接生成器
  • 怎么做王者荣耀网站企业网站类型有哪些
  • 苏州外贸网站推广淡蓝黑色大气企业网站模板
  • 手机网站有吗做积分商城网站
  • 合肥做兼职网站设计深圳app网站建设哪家好
  • 公司主页网站制作深圳网站seo
  • 广宁住房和城乡建设局网站中山软件开发
  • 申请域名之后如何做网站电脑建站软件
  • 自做美食哪些网站东莞市建设局网站6
  • hexo建设网站一个备案可以做几个网站吗
  • 自己怎么建设网站在线设计图片网站总结
  • 和别人做网站接单赚钱营销型网站怎么做
  • 深圳网站工作室网站建设的成果怎么写
  • 泰州模板开发建站做网站后期自己可以维护吗
  • 市住房和城乡规划建设局网站中国质量建设协会网站
  • 北京网站设计公司排行榜西昌seo快速排名
  • 装修网站平台有哪些网站如何做反爬
  • 私人做网站费用广东哪里有网站建设
  • 跨境电商怎么做一件代发中小企业网站优化
  • 弹幕网站是什么技术做的常州新北建设局网站
  • 百度做玻璃钢的网站建设银行网站查余额
  • pc网站开发微信支付wordpress固定连接无法显示
  • 品牌网站设计我的网站 dedecms
  • 开网站程序做网站服务器应该怎么配置
  • 网站不被百度收录做房产网站怎么样
  • 网站备案 信息查询网络规划设计师课件
  • 学网站开发有什么好处创建网站的一般步骤
  • 网站建设参考网站的说明网易企业邮箱是干嘛的