java技术研究

统计

留言簿(3)

阅读排行榜

评论排行榜

插入重复 并发


  场景:一般情况下,我们注册一个用户名,判断是否重复

  select count(name) from employee

   如果返回值大于0,说明已经存在了,不能用这个用户名注册,但是,并发情况下(load runner并发测试),同时注册十个,会插入多条相同用户名!

这时候,就要找到相应的解决方案了!经过测试,得出正确方法,给name字段添加唯一约束

  具体写法:

  alter table employees
  add constraint CK_st unique(name)

 

  测试通过,不会插入重复记录!

  还有一种方法,考虑用事务,插入数据完成后,执行select count(name) from employee,如果>1,则回滚事务,提示注册失败!

 

  由此,总结了一些约束的用法

  主键(primary key)约束:

  alter table employees
  add constraint CK_PrimaryId primary key(EmployeeId)--主键会自动添加约束

 

  核对(check)约束

  alter table employees
  add constraint CK_EmployeeType check(EmployeeType>1 and EmployeeType<5)--限制EmployeeType取值范围

 

  默认(default)约束

  alter table employees
  add constraint CK_Pass default'111' for  Pass--密码默认为'111'

 

  外键(foreign key)约束

  alter table employees
  add constraint CK_EmployeeId foreign key(employeeid)
  references EmployeeRange(employeeid)

  --保持表employees的employeeid字段和表EmployeeRange的employeeid字段一致

 

  唯一(unique)约束

  alter table employees
  add constraint CK_st unique(name)--唯一约束和主键约束的区别是唯一约束可以为空,主键约束不可以为空,主键约束也是唯一约束

posted on 2012-05-11 13:23 小秦 阅读(1194) 评论(2)  编辑  收藏

评论

# re: 插入重复 并发 2013-05-13 17:20 abin

除了sql,你没有用java来处理过吗?  回复  更多评论   

# re: 插入重复 并发[未登录] 2013-11-03 23:25 qing

A线程执行完save,然后select count(name) from employee=1,这时事务还没提交,然后
B线程才开始save,然后select count(name) from employee也会是=1,然后A线程才开始提交,最后B线程也提交,最终还是2条?虽然我没测,不过用count的方法应该是不行的
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: