首页 新闻 会员 周边 捐助

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

0
悬赏园豆:200 [已解决问题] 解决于 2013-05-24 15:52

我的想在数据库里加一个状态,被一个人点击后就会更新状态,别的人点击时查询已更新的状态就返回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!");
            }
        }
    }

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

_dance的主页 _dance | 初学一级 | 园豆:4
提问于:2013-05-14 11:28
< >
分享
最佳答案
0

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

_dance | 初学一级 |园豆:4 | 2013-05-24 15:20
其他回答(11)
0

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

收获园豆:40
丫的 | 园豆:1575 (小虾三级) | 2013-05-14 11:39

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

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 11:44

@_dance: 看了看楼下的回复

 数据库里面就和我上面说的就行了

程序里面可以搞个单例  搞个锁不就行啦

支持(0) 反对(0) 丫的 | 园豆:1575 (小虾三级) | 2013-05-14 16:08
0

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

收获园豆:20
Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 11:41

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

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 11:45

@_dance: 

还有时差问题?当我点击,没有执行完毕后面其他人无法执行吧!

难道还需要用到队列?排队访问?并发量大了这样容易阻塞吧!

支持(0) 反对(0) Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 12:02

@Beyond-bit: 如果在执行过程中多人点击怎么办呢,不就还有问题了吗?

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 12:47

@_dance: 

A用户点击了,连接即可失效了(其他用户点击不响应,失效!),直到A用户走完这个流程,然后才会激活连接方可供下一个用户点击撒!下一个用户只要点击,那么超链接照样失效,后来的还是不能点击!如何?

支持(0) 反对(0) Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 13:06

@Beyond-bit: 但是点击失效得把这个状态传到服务器才行啊,A用户点击后这个状态还没有送达服务器或在送达的过程中,那B用户就也点击了,或并发点击了,那还是一样不行的吧~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 13:15

@_dance: 

你可以将这个超链接存到数据库,并且加一个status字段,初始化的时候是可以点击的,status 是激活!当如果有用户点击了,那么失效,status =失效!其他用户访问,逻辑层判断status是激活还是失效?如果失效说明有人点击了,还没执行完毕(ajax 执行完毕修改status状态)!response给其他访问者超链接都是失效的!

支持(0) 反对(1) Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 13:43

@Beyond-bit: 如果并发状态下怎么弄呢~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 13:50

@_dance: 

好,那我们假设有并发,那你就用代码给其排队(队列)!让第一个人先走!其他的人都等着去吧!

理论上这种方法可行,不过需要实践!方案,仅供楼主参考!如有更好记得分享!good luck ~~~

支持(0) 反对(0) Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 13:56

@Beyond-bit: 

还有如果大并发,我想那么你的app应该有集群来解决这种request并发吧!这样极大的降低了我们这里并发的情况吧!

支持(0) 反对(0) Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 13:59

@Beyond-bit: 谢谢你能回复我这么多!

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 14:03

@_dance: 

呵呵,客气了,回复多少无所谓,今天刚有时间了,能解决问题更好撒!

更何况你这个问题确实很有意思!good luck ~~~只是给你方案!

支持(0) 反对(0) Beyond-bit | 园豆:2885 (老鸟四级) | 2013-05-14 14:05

@Beyond-bit: 肯教我这么多还是得谢谢你的,现在肯教人的人越来越少了,感觉,唉,还没有搞定呀,一楼那位朋友的方法可行,只是我的逻辑还没有想好~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 14:13

@Beyond-bit: 如果用户点进去未做任何操作,直接关闭窗口状态怎么修改,其他人怎么进去

支持(0) 反对(0) 超级菜鸟仔乃 | 园豆:202 (菜鸟二级) | 2017-11-08 08:39
0

非要在数据库中维护状态么?在后台加锁不行么?

收获园豆:20
TiestoRay | 园豆:687 (小虾三级) | 2013-05-14 12:11

不是太明白,请指教,谢谢了~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 12:48
0

关注一下

收获园豆:20
@@@一统@@@ | 园豆:1551 (小虾三级) | 2013-05-14 12:47
0

lock 不会用?真奇怪。

雨落心情1 | 园豆:214 (菜鸟二级) | 2013-05-14 12:55

我是坑,求大神不笑~

如果可以,你也可以教我一下Z~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 12:56
0

数据库加个锁。执行增删改的时候,当前一用户在执行操作的时候,即对数据进行锁定,执行完成再解锁。建议楼主百度一些数据库加锁的资料看看。

收获园豆:20
问心、 | 园豆:94 (初学一级) | 2013-05-14 13:42

我用了排它锁,但貌似查询后,再改状态时会有时间差= =,这怎么弄呢~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 13:44

@_dance: 查询和改状态放在一个事务里,同时给数据库加上“行锁”,这样行不行

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2013-05-14 15:39

@会长: 恩,可以的,不过我想到一个更简单的方法,谢谢了~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 15:41

@_dance: 什么方法?

支持(0) 反对(0) 会长 | 园豆:12461 (专家六级) | 2013-05-14 15:45

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

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-14 17:12
0

关注

收获园豆:20
KivenRo | 园豆:1734 (小虾三级) | 2013-05-14 13:48
0

想不到什么情况下会出现你需要的这种情况。

收获园豆:20
Eric.luo | 园豆:853 (小虾三级) | 2013-05-15 10:24

N多人订单处理~

支持(0) 反对(0) _dance | 园豆:4 (初学一级) | 2013-05-15 10:26

@_dance: tfs的签入签出用过吗?模仿那个吧。自己做的资源加锁模块会让你疯掉的。

支持(0) 反对(0) Eric.luo | 园豆:853 (小虾三级) | 2013-05-15 10:36
0

居然用表锁?直接乐观锁就解决了

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

收获园豆:20
Daniel Cai | 园豆:10424 (专家六级) | 2013-05-15 11:17
0

异步

收获园豆:20
丶菜牙 | 园豆:351 (菜鸟二级) | 2013-05-15 11:30
0

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

超级菜鸟仔乃 | 园豆:202 (菜鸟二级) | 2017-11-08 08:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册