mssql 2000 下类似论坛的楼层处理插入SQL语句

2 篇文章 0 订阅
其实去年做一个小型论坛的时候接触过这个方面的问题,当时也提出了一个解决方案,但由于没有大量的并发测试,所以不知道效果到底如何。

其实主要的问题就是集中在那个楼层计算上面。在前台页面显示有如下两种情况:
  1. 第几个回复就是第几楼。在数据库不保存楼层数,直接在前台输出的时候计算显示楼层。因此在有删除回复的情况下,楼层数是可变的,这样不利于楼层回复。
  2. 按照回复的顺序计算楼层。在数据库保存楼层数,即在插入回复时就计算出楼层。这样即使有删除的回复,每个回复的楼层数是不会变的。

所以尽量是要使用第二种情况。
去年的时候提出的解决方案如下:

其中主题表为tbl_post,回复表为tbl_reply

declare @floor int;
select @floor = (select count(*) from tbl_reply where postId = $postId) + 1;
insert into tbl_reply values($postId,$content,$userid,date,@floor,1,0);
Go

但这样其实明眼一看很容易造成冲突,因为没有给tbl_replay加修改锁,很有可能几个回复会得到同一楼层
于是这次又涉及到这个内容后,查询了一些资料,改进如下:
其中主题表为tbl_post,回复表为tbl_reply
BEGIN TRANSACTION
DECLARE @errorSun INT 
SET @errorSun=0
select * from zb_reply with (UPDLOCK); --给zb_reply表加修改锁
declare @floor int;
select @floor = (select count(*) from zb_reply where pid = $pid) + 1; --计算楼层
insert into zb_reply values($pid,$content,$userid,date,@floor,1);
SET @errorSun=@errorSun+@@ERROR
update zb_post set reply = reply + 1 where pid = ".$pid."; --给主题表添加回复数
SET @errorSun=@errorSun+@@ERROR --错误处理
IF @errorSun<>0 
BEGIN 
ROLLBACK TRANSACTION 
END 
ELSE 
BEGIN 
COMMIT TRANSACTION
END 

使用这个应该没有问题了,等过段时间上线了再测试下。如果研究过这个发面的高手路过,求指教求学习 可怜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值