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在每天凌晨的时候对中间表中的数据进行迁移,迁移的时候可以做判断,这样的话就比较快