怎么样让多个用户不能同时点击同一条数据

我的想在数据库里加一个状态,被一个人点击后就会更新状态,别的人点击时查询已更新的状态就返回false,但还有问题就是,如果多人同时点击同一个未更新状态的数据,这里应会出问题,怎么样才能防止多人同时点击同一条数据!!!

protected void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)
    {
        string id = DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
        string ssql = "select * from 数据表 with(tablockx) where ID='" + id + "'";
        SqlDataReader dr = SQLHelper.Order(ssql);
        string a = dr["状态"].ToString();
        dr.Close();
        if (a == "处理中")
        {
            Response.Write("false!");
        }
        else
        {
            string usql = "update 数据表 with(tablockx) set 状态='处理中' where ID='" + id + "'";
            int i=SQLHelper.ExecuteSql(usql);
            if (i > 0)
            {
                Response.Write("ture!");
            }
            else
            {
                Response.Write("false!");
            }
        }
    }

但这样子貌似还有问题,请大家帮忙提提建议!!!

慕盖茨4494581
浏览 955回答 35
35回答

当年话下

我想问一下如果用户点进去没进行任何操作直接关闭窗口,那怎么办,是不是所有人都进不去了?

Helenr

锁 异步

慕慕森

居然用表锁?直接乐观锁就解决了 create proc yourProcName (  @id varchar(15), @version uniqueidentifier, @HasViewd bit output ) as begin declare @rowcount int  set nocount off  update tb set version=newid() where id=@id and version=@version select @rowcount=@@rowcount if(@rowcount=1) set @HasViewd=1 else set @HasViewd=0 end

萧十郎

update 表 set 字段='处理中' where 字段<>'处理中' and ID=id;

沧海一幻觉

你分2次写有时间差的 写在一个存储过程同一事务里面

HUWWW

恩,是存在这个问题,谢谢了~

眼眸繁星

@_dance: 看了看楼下的回复  数据库里面就和我上面说的就行了 程序里面可以搞个单例  搞个锁不就行啦

qq_花开花谢_0

当有人点击设置超链接无法访问,当该方法执行完毕返回一个东东,然后再启用超链接!

忽然笑

这样还是有时间差的问题~,谢谢了~

慕桂英546537

@Beyond-bit: 如果在执行过程中多人点击怎么办呢,不就还有问题了吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server