存储过程插入更新记录的时候出现唯一键冲突错?

oldworm 2009-06-05 03:42:07
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
IF @@ROWCOUNT=0
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
END

如上的T-SQL代码执行的时候偶尔会出现唯一键冲突错误,貌似前面设置的事务属性没有生效,
如何解决这个问题呢,谁能指教一下?谢谢。
...全文
121 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzperfect 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 oldworm 的回复:]
用异常彻底解决问题了
csdn真是烂,想找个高人都找不到,真没意思。
[/Quote]

这么说不大好啊...从来没从csdn得到过有用的消息? 呵呵

楼主是否用的这个方法:
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
IF @@ROWCOUNT=0
BEGIN
BEGIN TRY
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
END TRY
BEGIN CATCH
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
END CATCH
END


我在1楼写的方法在10个进程ms级并发时,sql server 都不会报错. 再高的并发没有测试. 我是sql server 2008环境.
oldworm 2009-06-08
  • 打赏
  • 举报
回复
用异常彻底解决问题了
csdn真是烂,想找个高人都找不到,真没意思。
ziqing_deshi 2009-06-07
  • 打赏
  • 举报
回复
学习。
oldworm 2009-06-07
  • 打赏
  • 举报
回复
主键 dateid + xid
部分代码,其他代码跟这个表无关
nzperfect 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 oldworm 的帖子:]
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
IF @@ROWCOUNT=0
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
END

如上的T-SQL代码执行的时候偶尔会出现唯一键冲突错误,貌似前面设置的事务属性没有生效,
如何解决这个问题呢,谁能指教一下?谢谢。

[/Quote]

楼主,这是你完整的代码,还是一个示范?
代码之间是否还有其它逻辑?
唯一键是哪个?
sdhdy 2009-06-06
  • 打赏
  • 举报
回复
你的这个表RecInfo,哪个字段设了唯一性?
-晴天 2009-06-06
  • 打赏
  • 举报
回复
如果按楼主的代码,唯一键应设置为这两个列的组合才行.
-晴天 2009-06-06
  • 打赏
  • 举报
回复
DateID, xid, 哪一个要有唯一性?
oldworm 2009-06-06
  • 打赏
  • 举报
回复
经测试上面的代码还是有问题哦,谁能指导下?
oldworm 2009-06-06
  • 打赏
  • 举报
回复
触发器代码不知道如何写,楼上能指导下,给个例程吗?
sdhdy 2009-06-06
  • 打赏
  • 举报
回复
可以考虑用触发器试一下。
oldworm 2009-06-05
  • 打赏
  • 举报
回复
还是用了最土的显示事务处理,貌似没有问题了
BEGIN TRANSACTION
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
IF @@ROWCOUNT=0
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
COMMIT TRANSACTION
claro 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oldworm 的回复:]
什么时候这里的风气变成了“人云亦云”?
测试了一下,遗憾的是
IF NOT EXISTS(SELECT 1 FROM RecInfo WITH(NOLOCK) WHERE DateID=@DateID AND xid=@xid)
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
ELSE
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid

这段代码也出同样的错误!

[/Quote]帮顶
nzperfect 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oldworm 的回复:]
什么时候这里的风气变成了“人云亦云”?
测试了一下,遗憾的是
IF NOT EXISTS(SELECT 1 FROM RecInfo WITH(NOLOCK) WHERE DateID=@DateID AND xid=@xid)
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
ELSE
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid

这段代码也出同样的错误!

[/Quote]

确认你修改正确。
knifewei 2009-06-05
  • 打赏
  • 举报
回复
IF @@ROWCOUNT=0

换成IF @@Error=0
不知道可不可以,呵呵
oldworm 2009-06-05
  • 打赏
  • 举报
回复
什么时候这里的风气变成了“人云亦云”?
测试了一下,遗憾的是
IF NOT EXISTS(SELECT 1 FROM RecInfo WITH(NOLOCK) WHERE DateID=@DateID AND xid=@xid)
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
ELSE
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid

这段代码也出同样的错误!
ojuju10 2009-06-05
  • 打赏
  • 举报
回复
来晚了,up
kendyhxl 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 perfectaction 的回复:]
SQL code
IF NOT EXISTS(SELECT 1 FROM RecInfo WITH(NOLOCK) WHERE DateID=@DateID AND xid=@xid)
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
ELSE
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
[/Quote]
加锁
sdhdy 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 perfectaction 的回复:]
SQL code
IF NOT EXISTS(SELECT 1 FROM RecInfo WITH(NOLOCK) WHERE DateID=@DateID AND xid=@xid)
INSERT RecInfo (DateID, xid) VALUES (@DateID, @xid)
ELSE
UPDATE RecInfo SET LogonCount=LogonCount+1 WHERE DateID=@DateID AND xid=@xid
[/Quote]
正点。
ai_li7758521 2009-06-05
  • 打赏
  • 举报
回复
完美好强大.
加载更多回复(5)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧