当前位置: 代码迷 >> Sql Server >> 高并发安插 重复的 设计讨论
  详细解决方案

高并发安插 重复的 设计讨论

热度:89   发布时间:2016-04-24 09:59:53.0
高并发插入 重复的 设计讨论
client端有 5 个 tomcat(在5台机器) 做了负载均衡,  现在要往一张表tba(Id, Name)里面插入数据,先判断是否存在然后再添加.
tomcat 在启动的时候会把表 tba 数据加到内存里面去,先在内存里面判断是否存在,不存在则添加。但是经常会出现重复的,现在有一种方案是:
1 在tba name 上加一个唯一约束,然后 起一个事务,先判断存在,失败就回滚并且读出 已经存在的Id,, 这种在并发高的时候性比较慢,因为事务,约束是比较消耗资源的。 大家一般是怎么设计的 ?
begin try
 begin tran
  select @id = Id from tba where Name=@name
  if @id is null
   insert into tba(Name) values(@name)
  set@id = @@IDENTITY 
 commit tran
end try
begin catch
  select @id = Id from tba where Name=@name
end catch
------解决思路----------------------
1、前台程序可这样处理,报错后仍往下执行
    如:vb程序的:
   on error resume next
   sSQL="insert into tba(Name) values(@name)"
   .....
2、后台可以这样处理:

--不用加事务
insert into tba(name) SELECT '123' WHERE NOT EXISTS(SELECT * FROM  tba WHERE [Name]='123')

------解决思路----------------------
在内存中检索索引算什么消耗?
只是查找存在,根本没有任何冲突。
------解决思路----------------------
我的建议是建一个中间表,中间表不做任何约束,5台机器直接往中间表插数据,然后用一个job在每天凌晨的时候对中间表中的数据进行迁移,迁移的时候可以做判断,这样的话就比较快
  相关解决方案