1、情况说明:
本人是测试人员,测试通过excel 批量导入学员信息到mysql 数据库,手机号已经存在的不让导入;假如一个操作员导入,数据库中已经存在的手机号不让导入,是没有问题的。
后面进一步测试: 通过多个操作员,通过2个浏览器同时导入同一个excel,看看是不是同一个手机号码只能导入进去一个,结果出问题了,每个号码被导入了2次。
2、初步对代码分析(java):
insert into tq_student (student_name,student_phone)
select
#{student_name,jdbcType=VARCHAR},#{student_password,jdbcType=VARCHAR}
from dual where not exists
(select * from tq_student where
student_phone=#{student_phone,jdbcType=VARCHAR} )
粗想应该不会有问题。
3 、日志:
08-04 10:11:45,229 DEBUG insertWhenNotExist:139 – ==> Preparing: insert into tq_student (student_name, student_phone ) select ?,? from dual where not exists (select * from tq_student where student_phone=? )
08-04 10:11:45,230 DEBUG insertWhenNotExist:139 – ==> Parameters: 13600006100(String), 13600006100(String), 13600006100(String)
08-04 10:11:45,231 DEBUG insertWhenNotExist:139 – <== Updates: 1
08-04 10:11:45,232 DEBUG selectCountByReferralCode:139 – ==> Preparing: select count(1) from tq_student_referral where referral_code = ?
08-04 10:11:45,232 DEBUG selectCountByReferralCode:139 – ==> Parameters: r972km(String)
08-04 10:11:45,232 DEBUG insertWhenNotExist:139 – ==> Preparing: Preparing: insert into tq_student (student_name, student_phone ) select ?,? from dual where not exists (select * from tq_student where student_phone=? )
08-04 10:11:45,233 DEBUG insertWhenNotExist:139 – ==> Parameters: 13600006100(String), 13600006100(String), 13600006100(String)
08-04 10:11:45,235 DEBUG insertWhenNotExist:139 – <== Updates: 1
从日志看:是打印了2次插入信息
4、莫非是第一次插入的数据后,第2次插入之前查询这条数据比较慢,还没有查出来的原因,所以再次插入了同样的数据?
但查询能否数据已经存在的查询时间极短,试了多次只需要0.01s。
那最终怎么解决手机号码重复的问题呢?请高手指点,thks!
本人是测试人员,测试通过excel 批量导入学员信息到mysql 数据库,手机号已经存在的不让导入;假如一个操作员导入,数据库中已经存在的手机号不让导入,是没有问题的。
后面进一步测试: 通过多个操作员,通过2个浏览器同时导入同一个excel,看看是不是同一个手机号码只能导入进去一个,结果出问题了,每个号码被导入了2次。
2、初步对代码分析(java):
insert into tq_student (student_name,student_phone)
select
#{student_name,jdbcType=VARCHAR},#{student_password,jdbcType=VARCHAR}
from dual where not exists
(select * from tq_student where
student_phone=#{student_phone,jdbcType=VARCHAR} )
粗想应该不会有问题。
3 、日志:
08-04 10:11:45,229 DEBUG insertWhenNotExist:139 – ==> Preparing: insert into tq_student (student_name, student_phone ) select ?,? from dual where not exists (select * from tq_student where student_phone=? )
08-04 10:11:45,230 DEBUG insertWhenNotExist:139 – ==> Parameters: 13600006100(String), 13600006100(String), 13600006100(String)
08-04 10:11:45,231 DEBUG insertWhenNotExist:139 – <== Updates: 1
08-04 10:11:45,232 DEBUG selectCountByReferralCode:139 – ==> Preparing: select count(1) from tq_student_referral where referral_code = ?
08-04 10:11:45,232 DEBUG selectCountByReferralCode:139 – ==> Parameters: r972km(String)
08-04 10:11:45,232 DEBUG insertWhenNotExist:139 – ==> Preparing: Preparing: insert into tq_student (student_name, student_phone ) select ?,? from dual where not exists (select * from tq_student where student_phone=? )
08-04 10:11:45,233 DEBUG insertWhenNotExist:139 – ==> Parameters: 13600006100(String), 13600006100(String), 13600006100(String)
08-04 10:11:45,235 DEBUG insertWhenNotExist:139 – <== Updates: 1
从日志看:是打印了2次插入信息
4、莫非是第一次插入的数据后,第2次插入之前查询这条数据比较慢,还没有查出来的原因,所以再次插入了同样的数据?
但查询能否数据已经存在的查询时间极短,试了多次只需要0.01s。
那最终怎么解决手机号码重复的问题呢?请高手指点,thks!
解决方案
20
同时导入判断得到的都是表里面没有这个手机号,当然能导进去,加锁吧
30
高并发下就会出现这样的问题, 原因是select 和 insert 不是原子操作. 在select出来到insert提交到库中间可能已经有很多个请求了, 当你未提交到数据库之前其它人也抽不到这个数据, 所以仍然做insert处理. 解决办法就是做唯一索引.
30
你的这个问题,就是并发问题,虽然查询能否存在只需要极短的时间,但是在两者同时执行插入的时间也是极短的。这存在概率性问题
楼上的意见不错,设置数据库字段的唯一约束,这样能保证某个字段不重复
楼上的意见不错,设置数据库字段的唯一约束,这样能保证某个字段不重复
10
那就给方法加锁,同一时间只能有一个人去导入操作
10
在数据库表中加一个字段,进行版本控制