请教:Sql里能加锁吗?

[复制链接]
查看11 | 回复9 | 2015-3-4 14:19:44 | 显示全部楼层 |阅读模式
我的网站程序里有一条SQL:
string sql = "update tb1 set name='a' where id=1; if @@rowcount = 0 insert into tb1(id, name)values(1,'a')";
这个语句执行时,会不定时出现id主键冲突的错误:违反了 PRIMARY KEY 约束
请问如何避免这个错误?是不是要在sql里加上事务才能解决呢?
或者要使用别的方法?
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
用个递增序列做主键吧,自己写的终归效率有点问题
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
这个表是用来记录当前在线用户的,所以主键id,不能用递增,而是引用别的表的值
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
更新不成就插入,怎么会主键冲突呢


回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
是啊,我也觉得很奇怪,这个错误到是很少出现,可能几天出现1次
会不会是用户访问太多,并发比较大造成的?
加上事务,能解决这个问题吗?
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
如有聚集索引把聚集索引去掉试试看,每天dbcc indexdefrag和dbcc cleantable一下该表
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
你的意思是去掉聚集索引,
要不要把id改成非聚集索引?
如果不加索引肯定是不行的,这个表的数据也有百万
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
原帖由 youbl 于 2011-1-12 13:45 发表
你的意思是去掉聚集索引,
要不要把id改成非聚集索引?
如果不加索引肯定是不行的,这个表的数据也有百万

是把ID改成非聚集索引,聚集索引会影响并发
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
谢谢您的答复,我试试
回复

使用道具 举报

千问 | 2015-3-4 14:19:44 | 显示全部楼层
即使加事务,估计也不行的。
考虑到多连接同时执行的并发情况下,就可能出现楼主这里说的主键冲突。
我们是专门做SQLSERVER上的数据库集群的。欢迎联系,探讨:QQ 809210869
www.zhetides.com.cn
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行