我的想在数据库里加一个状态,被一个人点击后就会更新状态,别的人点击时查询已更新的状态就返回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!"); } } }
但这样子貌似还有问题,请大家帮忙提提建议!!!
update 表 set 字段='处理中' where 字段<>'处理中' and ID=id;
你分2次写有时间差的 写在一个存储过程同一事务里面
恩,是存在这个问题,谢谢了~
@_dance: 看了看楼下的回复
数据库里面就和我上面说的就行了
程序里面可以搞个单例 搞个锁不就行啦
当有人点击设置超链接无法访问,当该方法执行完毕返回一个东东,然后再启用超链接!
这样还是有时间差的问题~,谢谢了~
@_dance:
还有时差问题?当我点击,没有执行完毕后面其他人无法执行吧!
难道还需要用到队列?排队访问?并发量大了这样容易阻塞吧!
@Beyond-bit: 如果在执行过程中多人点击怎么办呢,不就还有问题了吗?
@_dance:
A用户点击了,连接即可失效了(其他用户点击不响应,失效!),直到A用户走完这个流程,然后才会激活连接方可供下一个用户点击撒!下一个用户只要点击,那么超链接照样失效,后来的还是不能点击!如何?
@Beyond-bit: 但是点击失效得把这个状态传到服务器才行啊,A用户点击后这个状态还没有送达服务器或在送达的过程中,那B用户就也点击了,或并发点击了,那还是一样不行的吧~
@_dance:
你可以将这个超链接存到数据库,并且加一个status字段,初始化的时候是可以点击的,status 是激活!当如果有用户点击了,那么失效,status =失效!其他用户访问,逻辑层判断status是激活还是失效?如果失效说明有人点击了,还没执行完毕(ajax 执行完毕修改status状态)!response给其他访问者超链接都是失效的!
@Beyond-bit: 如果并发状态下怎么弄呢~
@_dance:
好,那我们假设有并发,那你就用代码给其排队(队列)!让第一个人先走!其他的人都等着去吧!
理论上这种方法可行,不过需要实践!方案,仅供楼主参考!如有更好记得分享!good luck ~~~
@Beyond-bit:
还有如果大并发,我想那么你的app应该有集群来解决这种request并发吧!这样极大的降低了我们这里并发的情况吧!
@Beyond-bit: 谢谢你能回复我这么多!
@_dance:
呵呵,客气了,回复多少无所谓,今天刚有时间了,能解决问题更好撒!
更何况你这个问题确实很有意思!good luck ~~~只是给你方案!
@Beyond-bit: 肯教我这么多还是得谢谢你的,现在肯教人的人越来越少了,感觉,唉,还没有搞定呀,一楼那位朋友的方法可行,只是我的逻辑还没有想好~
@Beyond-bit: 如果用户点进去未做任何操作,直接关闭窗口状态怎么修改,其他人怎么进去
非要在数据库中维护状态么?在后台加锁不行么?
不是太明白,请指教,谢谢了~
关注一下
lock 不会用?真奇怪。
我是坑,求大神不笑~
如果可以,你也可以教我一下Z~
数据库加个锁。执行增删改的时候,当前一用户在执行操作的时候,即对数据进行锁定,执行完成再解锁。建议楼主百度一些数据库加锁的资料看看。
我用了排它锁,但貌似查询后,再改状态时会有时间差= =,这怎么弄呢~
@_dance: 查询和改状态放在一个事务里,同时给数据库加上“行锁”,这样行不行
@会长: 恩,可以的,不过我想到一个更简单的方法,谢谢了~
@_dance: 什么方法?
@会长: update 表 set 字段='处理中' where 字段<>'处理中' and ID=id;
关注
想不到什么情况下会出现你需要的这种情况。
N多人订单处理~
@_dance: tfs的签入签出用过吗?模仿那个吧。自己做的资源加锁模块会让你疯掉的。
居然用表锁?直接乐观锁就解决了
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
锁
异步
我想问一下如果用户点进去没进行任何操作直接关闭窗口,那怎么办,是不是所有人都进不去了?