数据库高并发情况下重复值写入的避免 字段组合约束

10线程同时操作,频繁出现插入同样数据的问题。虽然在插入数据的时候使用了:
insert inti tablename(fields….) select @t1,@t2,@t3 from tablename
where not exists (select id from tablename where t1=@t1,t2=@t2,t3=@t3)
当时还是在高并发的情况下无效。此语句也包含在存储过程中。(之前也尝试线判断有无记录再看是否写入,无效)。
因此,对于此类情况还是需要从数据库的根本来解决,就是约束。否则数据库的原子操作细不到我所需要的层面。
添加约束的命令行用得人不多,网上每次找SQL语句都累死,还是写下来好了。
需要的关键就叫做 字段组合约束唯一性 alter table tablename add CONSTRAINT
NewUniqueName Unique(t1,t2,t3) 这样可以保证三个字段组合不重复
在生产系统数据库的调整真是锱铢必较。。。。。。
对于数据库读操作的重复暂时没有好的解决方法,就是读数据库某些条目同时将这些条目某个字段修改为1,然后其他进程读的时候就不会重复读取。但是在多线程情况下即使我使用了SQL
SERVER 2005最新的特性,就是类似update…output into到临时表的方法:
update tablename set
OnCheck=1,LastLockTime=getdate(),LastChecktime=getdate() output
deleted.ID into @newtb where ID in (select id from tablename where
Oncheck=0) 还是会造成重复读。难道没有更好的办法了吗?
如果大家有更好的方法,可以发出来。

转自:

 

–SQL Server:
Select TOP N * From TABLE Order By NewID() 

–开头到N条记录
Select Top N * From 表

–N到M条记录(要有主索引ID)
Select Top M-N * From 表Where ID in (Select Top M ID From 表) Order by ID  Desc

–选择10从到15的记录
select top 5 * from (select top 15 * from table order by id asc) A 
order by id desc 

–N到结尾记录
Select Top N * From 表Order by ID Desc
 
统计比例:0.11

select cast( (sum( case when id=2 then 1 else 0 end) +0.00)/Count(1) as decimal(18,2)) as 比例 from @rtb  

 

 

 

–显示最后5条记录,但是显示的顺序必须为5,6,7,8,9,10,而不是10,9,8,7,6,5
如下解决方法:

select top 5 from test where id in(select top 5 from test orderby id desc) orderby id asc 

–通过这个问题也能总结出4-10条,5-100条这种限定一定范围内的sql语句的写法:

selecttop<末端ID-顶端ID+1>*from<表名>where ID notin(selecttop<顶端ID-1>)
ID from<表名>)

–例如:4-10条就应该写成
selecttop10-4+1*from test where id notin(selecttop4-1 id from test)

  

 上一篇: select top 1 * from [news_table] where
[新闻标识列]<当前id号 where ……
 下一篇: select top 1 * from [news_table] where
[新闻标识列]>当前id号 where …… order by [新闻标识列] desc

 

 

–最新发布的20条信息列表,要求包含:信息ID、信息标题、信息发布时间、信息发布人姓名、信息评论总数和最后评论时间,并且按最后评论时间排序SelectTop(100)
a.infoID,a.infoTitle,a.infoPubDate,c.userName,Max( b.infoReplyDate
) As 最后时间,Count( b.infoReplyID ) As 评论总数 From info
a LeftJoin[InfoReply] bOn a.infoID = b.infoID LeftJoin[User] c On a.infoPubUser = c.userNo And b.infoReplyUser =c.userNo GroupBy a.infoPubDate,a.infoID,a.infoTitle,c.userName OrderByMax(
a.infoPubDate ) desc

 

 create table t (name varchar(20))

图片 1

图片 2

–drop table t
–DELETE t

insert  into t
        select  ‘1’
        union all
        select  ‘2’
        union all
        select  ‘3’
        union all
        select  ‘5’
        union all
        select  ‘5’
        union all
        select  ‘5’
        union all
        select  ‘6’
        union all
        select  ‘3’
        union all
        select  ‘4’
 
/*  找出相同的 

3
5
5
5
3
*/

–1.   in
select  *
from    t
where   NAME in (select name
                 from   t
                 group by name
                 having count(name)>1)

–2.  join

select  t.*
from    t
join    (select name
         from   t
         group by name
         having count(name)>1
        ) a on T.NAME=a.name

 
–3 .  EXISTS
select  *
from    t
where   exists ( select *
                 from   (select name
                         from   t
                         group by name
                         having count(name)>1
                        ) a
                 where  a.NAME=t.name )

— 4.  2005  ROW_NUMBER()
select  t.*
from    t
join    (select *
         from   (select row_number() over (partition by NAME order by name) as id,
                        name
                 from   t
                ) a
         where  id=2
        ) b on t.NAME=b.name

图片 3