首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

记一次有意思业务实现 → 单向关注是关注,双向关注则成好友

开心一刻   有个问题一直困扰着:许仙选择了救蛇,为什么杨过却选择救雕(不救蛇)   后面想想,其实杨过救神雕是有原因,当年神雕和巨蛇打架时候   雕对杨过说:杀蛇,杀蛇,杀蛇!   ...,往 tbl_follow 插入一条记录   看似没问题,可如果我们从并发角度来看,是不是还正常了?   ... 中两条记录   该如何处理该问题,欢迎大家评论区留言 JVM 锁   既然并发了,那就加锁呗   JVM 自带 synchronized 和 Lock 都有同步作用,我们以 synchronized...> other_side_id ,则执行如下逻辑   不太容易看懂,我们直接看代码实现   执行效果如下   我们分析下结果 tbl_follow_plus 只插入了一条记录 relation_ship...= 3 表示双向关注 tbl_friend 插入了一条记录 同时关注 这个业务就实现了   有小伙伴就有疑问了:楼主你只分析了 one_side_id 关注 other_side_id 情况,

74820
您找到你想要的搜索结果了吗?
是的
没有找到

【经验分享】后台常用万能密码

,相同就错,搜了一下网上,几乎没有过滤参数,可以用经典'or'='or'进去,'xor都可以进去,大家可以尝试一下。..."源代码,从中找到后台登录页面"login.asp"其中有以下一段代码: <% (1)pwd = request.form("pwd") "获取客户端输入密码,再把值赋给pwd" (2)name...msg=您输入了错误帐号或口令,请再次输入!"...,就交给了SQL语句查询,如果查询记录是位于最后一条记录之前,刚设置Session变量UserName,PassWord值分别为Name,pwd,并重定向到"Manage.asp".    ...or真or假and假,通过简单运算,则最终为真,SQL语句查询结果也变成真了,这样大家可能还不怎么听得懂,换成另一条语句:1' or 1=1 or '1'='1,那么SQL语句就变成了sql

9.2K70

面试题86:DELETE操作对应undo日志

也就是说,这条记录不是正常记录,也不是已删除记录。在删除语句所在事务提交之前,被删除记录一直都处于这种中间状态(其实主要是为了实现MVCC功能才这样处理)。...这种情况会频繁发生,也就会随着记录越多产生越来越多空间碎片。...只有当页面块满时候,如果再插入一条记录,无法分配一条完整记录空间时,会先查看PAGE_GARBAGE空间和剩余空间相加是否可以容纳这条新记录,如果可以,InnoDB则会尝试重新组织页内记录。...为什么TRX_UNDO_DEL_MARK_REC类型undo日志保存旧记录trx_id值和roll_pointer值?...我们先插入两条记录: BEGIN; # 显示开启一个事务,假设该事务事务id为100 # 插入两条记录 INSERT INTO tb_user(id, name, city) VALUES(1, 'muse

22220

这次终于懂了,InnoDB七种锁(收藏)

这对于事务A来说,就很奇怪了,AUTO_INCREMENT列,连续插入了两条记录一条是4,接下来一条变成了6,就像莫名其妙幻影。...: (1)多个事务可以拿到一把S锁,读读可以并行; (2)只有一个事务可以拿到X锁,写写/读写必须互斥; 共享/排它锁潜在问题是,不能充分并行,解决思路是数据多版本,具体思路在《InnoDB并发如此高...t where id>10; 事务B后执行,在10与20两条记录中插入了一行: insert into t values(11, xxx); 这里: (1)会使用什么锁?...,MyISAM索引和记录是分开存储。...画外音: 为什么要阻止id=10记录插入? 如果能够插入成功,头一个事务执行相同SQL语句,会发现结果集多出了一条记录幻影数据。

1.8K40

MYSQL RR隔离级别下MVCC及锁解读

脏读 所有事务都可以看到其他未提交事务执行结果 不可重复读 同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到数据结果会不一致 幻读 当事物A查询某一范围数据时,另一个事务B又在该范围内插入了新行并作了提交...当v1=40记录有多条时候,插入id值要小于其中最大id值。则可以成功插入; 当插入右侧值时候,插入v1=50时候,要求插入id值要大于id=18范围。...当v1=50记录有多条时候,插入id值要大于其中最小id值。则可以成功插入。 所以为什么RR隔离级别下并发性能会有所下降,就是因为存在间隙锁。...Dead lock: 是指两个或两个以上进程在执行过程中,因争夺资源造成一种互相等待现象。...先删再两条insert当需要进行唯一性冲突检测时,需要先加一个S锁,也会产生死锁。 那么对应解决死锁问题关键就是:让不同session加锁有次序。

3.1K80

MySQL死锁案例分析

多个事务在同一个索引、同一个范围区间内插入记录时,如果插入位置不冲突,则不会阻塞彼此; 举个例子:在可重复读隔离级别下,对PK ID为10-20数据进行操作: 事务1在10-20记录中插入了一行...: insert into table value(11, xx) 事务2在10-20记录中插入了一行: insert into table value(12, xx) 由于两条插入记录不冲突,所以会使用插入意向锁...一个事务正在往表中插入记录时,其他事务插入必须等待,以便第1个事务插入行得到主键值是连续。 举个例子:在可重复读隔离级别下,PK ID为自增主键 表中已有主键ID为1、2、33条记录。...事务1插入了一行: insert into table value(‘aa’) 得到一条(4,’aa’)记录,未提交; 此时,事务2中插入了一行: insert into table value(‘bb...举个例子: 假如数据库已有ID为1、6两条记录,现在想要在ID in (4,10)之间更新数据时候,会加上间隙锁,锁住[4,5] [7,10] ,(不包含已有记录ID=5本身) 那么在更新ID=5记录

2.2K20

MySQL普通索引和唯一索引到底什么区别?

不同是,在一张表里面只能有一个主键,主键不能为空,但唯一索引可以有多个。唯一索引可以有一条记录为null。...于是现在有如下选择: 在id_card创建唯一索引 创建一个普通索引 假定业务代码已经确保不会写入重复身份证号,这两个选择逻辑上都是正确。 性能优化角度考虑,选择唯一索引还是普通索引呢?...一条记录时,并非将该一个记录从磁盘读出,而以页为单位,将其整体读入内存。 所以普通索引,多了一次“查找和判断下一条记录操作,一次指针寻找和一次计算。...本文前提是“业务代码已经保证不会写入重复数据”,才讨论性能问题。 如果业务不能保证或业务就是要求数据库来做约束 没得选,必须创建唯一索引。...如果没有复现,检查 隔离级别是不是RR(Repeatable Read,可重复读) 创建表t是不是InnoDB引擎 为什么经过这个操作序列,explain结果就不对了?

57410

MySQL普通索引和唯一索引到底什么区别?

现有如下选择: 在id_card创建唯一索引 创建一个普通索引 假定业务代码已确保不会写入重复身份证号,这两个选择逻辑上都正确。 但性能角度考虑,选择哪个呢? 假设字段 k 上值都不重复。...一条记录时,并非将该一个记录从磁盘读出,而以页为单位,将其整体读入内存。 所以普通索引,多了一次“查找和判断下一条记录操作,一次指针寻找和一次计算。...该更新做了如下操作: Page1在内存,直接更新内存 Page2不在内存,就往change buffer区,缓存一个“往Page2一行记录信息 将前两个动作记入redo log 至此,事务完成。...到底何时使用唯一索引 问题就在于“业务可能无法确保”,本文前提是“业务代码已保证不会写入重复数据”,才讨论性能问题。 若业务无法保证或业务就是要求数据库来做约束 没有撤退可言,必须创建唯一索引。...如果没有复现,检查 隔离级别是不是RR(Repeatable Read,可重复读) 创建表t是不是InnoDB引擎 为什么经过这个操作序列,explain结果就不对了?

2.2K41

ASP.NET Core应用中如何记录和查看日志

日志记录不仅对于我们开发应用,还是对于ASP.NET Core框架功能都是一项非常重要功能特性。...创建一个Logger对象,我们利用后者写入了一条Information等级日志。...我们运行程序之后利用浏览器访问目标地址后,宿主控制台上会出现如下图所示三条日志。除了第二条日志是由我们自己编写代码写入之外,其余两条都是ASP.NET Core框架自己写入。...但是这不是ASP.NET Core问题,而是我们在调用LoggerFactory扩展方法AddConsole注册ConsoleLoggerProvider时候并未显式开启针对日志范围支持。...在这种情况下,我们就需要使用记录日志进行差错和纠错,因为ASP.NET Core在处理请求遇到异常都会记录到日志中。

1.6K80

MySQL为什么会有幻读问题?

幻读问题 语义问题 session A在T1时刻就声明了,“要把所有d=5行锁住,不准别的事务进行读写操作”。实际上,这个语义被破坏了。...但id=1这一行,在DB里结果是(1,5,5),根据binlog执行结果是(1,5,100),幻读依旧。 为何把所有记录都上锁了,还是阻止不了id=1这行插入和更新?...即使把所有记录都加锁,还是阻止不了新插入记录,这也是为什么“幻读”会被单独拿出来解决。 InnoDB解决幻读 幻读原因 行锁只能锁行,但是新插入记录这个动作,要更新记录之间“间隙”。...因为表t里并没c=7记录,因此session A加间隙锁(5,10)。session B也是在这个间隙加间隙锁。它们有共同目标,:保护这个间隙,不允许插入值。但它们之间不冲突。...如果大家都用读提交,可是逻辑备份时,mysqldump为什么要把备份线程设置成可重复读? 然后,在备份期间,备份线程用是可重复读,业务线程用是读提交。

36510

【MySQL (三) | 五分钟搞清楚MySQL事务隔离级别】

数据库操作最小工作单元,是作为单个逻辑工作单元执行一系列操作;事务是一组不可再分割操作集合(工作逻辑单元) 举个栗子: 事务最经典常用栗子可能就是转账:一个账户少钱了,哪另一个账户肯定要多钱,李永龙说过...举个栗子: 假设某公司工资为10000有10个人 1.事务1,读取所有工资为10000员工,会读取到10条记录; 2.事务2此时向工资表中插入了一条员工记录,工资正好也是10000; 3.事务1再次读物所有工资为...不可重复重点是修改 : 同样条件 , 你读取过数据 , 再次读取出来发现值不一样了 幻读重点在于新增或者删除 同样条件 , 第 1 次和第 2 次读出来记录数不一样 为了解决上边所说几个问题...不知道这个名字是怎么起,为了增强大家印象,可以这么想,这个事务好轻浮啊,饥渴到连别人没提交东西都等不及,真脏,呸! 实际上我们数据改变了吗?...结果,问题产生了,竟然不进去 结论 此处需要注意是,因为我们使用Innodb引擎,所以此处不会产生幻读,其他引擎的话在这个隔离级别可能会产生幻读(至于为什么说Innodb不会,且听下回分解,其实MySQL

62650

哎,被这个叫做at least once玩意坑麻了。

我们敲代码,不就是要多考虑这些正常流程之外“小概率事件”吗,只写正常流程,谁都会写。 根据官方说法,消息重复会发生在这些场景中: 发送时消息重复。...还是需要数据库通过唯一索引来帮我保证只有一条数据被成功落库,所以我想着抽一个专门表出来,比如叫做消息消费记录表。 只要数据插入了这个表,就代表消息被消费了。后续即使重发,也不会插入成功。... MQ 没有收到这个消息回执,也会再次进行投递。 由于消息消费记录表里没有这个数据,所以会再次进行消费。 在上面的这个过程中,MQ 再次投递,是为了 at least once。...而我们引入了消息消费记录表,通过唯一索引来保证不重复消费,这个玩意加上 at least once,在业界有另外一个叫法:exactly-only。...于是手动写了这样一坨代码,四处散落在模块里面。 后来一个师兄看了代码,提出了应该用事务来保证这样逻辑,并给我做了演示,才去了解了事务相关东西。

8510

不是说你会aop吗?

下面是跟小王主要对话。 :说说怎么了? 小王:记录接口日志功能放到了每个controller中,现在感觉有点繁琐,这样做是不是不太合适? 为什么要去每个接口里记录日志?...小王:最开始是用拦截器,但是这样一个请求就记录两条记录为什么两条? 小王:在preHandle中记录一条请求数据,在postHandle中记录一条响应数据。 :。。。...你不是说你会Aop吗? 小王:Aop也是一样,在前置通知记录一条请求数据,后置通知记录一条响应数据。...小王:这个数据和以前记录操作日志不太一样,以前只需要在前置通知记录一条操作日志就可以了,但是现在有响应,所以只能在controller中记录日志了。 :那你知不知道有个环绕通知?...) 异常通知:在我们目标方法出现异常后运行(@AfterThrowing) 环绕通知:目标方法调用由环绕通知决定,你可以决定是否调用目标方法,joinPoint.procced()就是执行目标方法代码

39030

你确定分得清MySQL普通索引和唯一索引?

不同是,在一张表里面只能有一个主键,主键不能为空,唯一索引可以有多个,唯一索引可以有一条记录为空,保证跟别人不一样就行。...于是现有俩选择: 给id_card字段创建唯一索引 创建一个普通索引 假定业务代码已保证不会写入重复身份证号,这两个选择逻辑上都正确。但从性能角度考虑,唯一索引还是普通索引呢?...一条记录时,并非将该一个记录从磁盘读出,而以页为单位,将其整体读入内存。 因此普通索引,要多做一次“查找和判断下一条记录操作,也就一次指针寻找和一次计算。...本文前提是“业务代码已经保证不会写入重复数据”下,讨论性能问题。 如果业务不能保证,或者业务就是要求数据库来做约束,那么没得选,必须创建唯一索引。...如果没有复现,检查 隔离级别是不是RR(Repeatable Read,可重复读) 创建表t是不是InnoDB引擎 为什么经过这个操作序列,explain结果就不对了?

1.4K10

为什么sql没问题但还是这么慢|MySQL加锁规则

或许此时你已经对于为什么多人调试程序时数据库访问不时出现卡顿有了一些自己想法,当然这只是锁机制冰山一角。...在这个例子当中,线程A事务和线程B事物分别占有id=1和id=2这两条记录写锁,使得两个线程在试图获取其他线程占用锁资源时陷入死锁。...InnoDB存储引擎默认事务隔离级别是可重复读(Read Repeatable),简单来说:就是当事务A启动期间,普通select查询将无法访问到其他事务在此期间对表记录改动。...上面讲解死锁检测时候用更新语句获得了行记录写锁,而这里,通过增加for update后缀,可以使得当前读操作也获取行记录写锁。...• 此时事务B并发插入了一条(2,1)记录,并且成功。 • 事务A第二个sql依旧查询c=1记录,获得(1,1)、(2,1)两条记录,从语义上违背了第一条sql目的。

80130

MySQL系列一:掌握MySQL底层原理从学习事务开始

所以学一个知识,总在想有没有那样一个万变不离其宗底层知识,掌握了它便能一通百通,相关问题就都会了,比如面试官问这些问题: 写线程操作一条数据,另外一个读线程也在读取这条数据,写线程还没有提交事务...是不是感觉自己离三万月薪还差一点? 同样关于网络知识也是如此,面试时会经常被人问到三次握手、四次挥手过程。 那到底三次握手、四次挥手是为了什么? 为什么是三次握手、四次挥手?...ACID。另外,原子性、隔离性、持久性最终都是为了一致性,一致性是事务最终目的。 我们先总体上看一条更新类型SQL语句它内部执行流程,然后再跟进去学习每一个细节知识点。...当MySQL执行一条更新语句时候,InnoDB引擎会把记录先写到redo log文件中,并更新内存。...binlog日志是持续追加写入,不存在被覆盖一说。 binlog有两种模式,statement 格式的话是记sql语句, row格式会记录内容,记两条,更新前和更新后。

85010

处理重复消息?消息有序性?消息堆积处理?

其实可以这么理解,发布/订阅模型等于我们都加入了一个群聊中,一条消息,加入了这个群聊的人都能收到这条消息。...小结一下 队列模型每条消息只能被一个消费者消费,发布/订阅模型就是为让一条消息可以被多个消费者消费而生, 当然队列模型也可以通过消息全量存储至多个队列来解决一条消息被多个消费者消费问题,但是会有数据冗余...因此还是看业务,例如日志传输可能丢那么一两条关系不大,因此没必要等消息刷盘再响应。 如何处理重复消息 我们先来看看能不能避免消息重复。...或者记录关键key,比如处理订单这种,记录订单ID,假如有重复消息过来,先判断下这个ID是否已经被处理过了,如果没处理再进行下一步。当然也可以用全局唯一ID等等。...因此我们需要先定位消费慢原因,如果是bug则处理 bug ,如果是因为本身消费能力较弱,我们可以优化下消费逻辑,比如之前是一条一条消息消费处理,这次我们批量处理,比如数据库插入,一条一条和批量效率是不一样

1.5K20
领券