昨天面试,被面试官问到。。。
比如用户注册时,先要验证用户名是否存在,但是在验证过后可能还会被插入相同用户名的数据,这就造成了冲突。
应该怎么解决?
做事务处理,将判断、插入两个动作写在一个事务中
验证的同时,将用户名插入一个临时表,下一个用户验证时要与临时表数据一并比对,用户注册完成后删除临时表的当条记录
写在同一个事务其实也不能解决重复的问题 主要是设置唯一索引 相同用户名的时候 数据库自然会回滚后插入的
设置唯一索引(用户名)
楼主,想知道这个验证用户名是否存在,然后还要去插入重复数据的业务场景是啥,为什么会有这样的需求呢?
1、程序层面,设置单线程,线程内包含select重复校验和保存方法。这样第二个指令必须等到第一个指令执行完毕才执行。这样的好处是效果是绝对的,
但是极大并发下,效率低。
2、数据库层面。这就是乐观锁和悲观所了。
当验证用户的时候,如果数据库内有。直接返回。如果数据库内没有,则插入这条用户信息(也可以用临时表的方式),但是用户状态是无效,并将本条数据枷锁,而如果用本
用户进行注册的时候,其实是直接修改用户的状态变为有效。
所谓悲观所就是直接对这条信息for update,谁都不能用,就当前这个事物能用。
所谓乐观锁就是插入以后返回一个版本号。
接下来,如果有其他的用户也用这个用户名了。那版本号就加1,那就是看你俩谁快了。如果你点保存。的时候发现你的版本号小于数据库的版本号。
那你就要重新获取一个版本号,如果发现不小于,那这个用户名就是你的。如果发现已经生效了。那用户就是别人的了。