VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2581|回复: 19

说说在处理WEB数据更新时,如何保证只有一个用户在编辑某一条记录?

[复制链接]

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-20 18:30:01 | 显示全部楼层 |阅读模式
我没有使用时间戳,那样是在提交数据时判断,我使用的是在需要唯一更新的表上加一个时间字段,该字段用来记录最后一次更新该记录的时间,比如说现在要更新的记录的时间字段值为2017-01-01 1:00:00,预先定义的操作超时时间间隔为20分钟,如果操作时间与记录中的时间字段相比较未超出定义的超时间隔,则认为有人在编辑该条记录,否则则认为可以编辑超时记录。
说说大家在处理这样的操作时是如何做的?
回复

使用道具 举报

0

主题

119

帖子

67.00

积分

新手上路

Rank: 1

积分
67.00
发表于 2020-4-30 02:00:01 | 显示全部楼层
在页面上控制好像不可能了,不过数据库有保证并发的机制呀!不知楼主意欲何为?
如果想保证你所说的那种情况,个人认为可以数据库中加个标记列,为真时保证它可编辑,否则不可编辑
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-30 14:15:01 | 显示全部楼层
to 苹果小刀:
对于数据的添加与删除不用考虑这个问题,主要是对数据的更新,因为要保证在编辑的时候只有一个人在编辑某条记录,因此,我使用时间,如果使用标记列,那么在客户端异常时,该条记录将再无法编辑。
回复

使用道具 举报

0

主题

43

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-1 21:15:01 | 显示全部楼层
可以设置一application对象来记录正在编辑的记录,任何一个用户编辑一条记录时,都去判断application里是否有该条记录的id,如果有,就不允许编辑,没有就允许,编辑完保存后,从application里删除该记录的id
回复

使用道具 举报

0

主题

26

帖子

20.00

积分

新手上路

Rank: 1

积分
20.00
发表于 2020-5-2 19:00:01 | 显示全部楼层
可以从数据库着手去考虑这个问题,例如使用表锁,记录的标识等。
回复

使用道具 举报

1

主题

11

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-5-2 23:15:01 | 显示全部楼层
额外建立一个表,记录所有被编辑的记录,其他人打开编辑记录时首先进行检测,如果存在则提示锁定。

直接利用数据库好像不怎么好吧~~不知道怎么控制
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-3 09:30:01 | 显示全部楼层
不可行,

最基本的做法就是用事务处理
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-5-3 14:00:01 | 显示全部楼层
持继关注...
回复

使用道具 举报

0

主题

32

帖子

22.00

积分

新手上路

Rank: 1

积分
22.00
发表于 2020-5-5 14:45:01 | 显示全部楼层
这种情况必然存在,只能处理,不能保证。
只能用事务,在数据库中单纯的判断怎么都不行,脏读,重复读的情况解决不了。
回复

使用道具 举报

0

主题

29

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-5-6 09:00:01 | 显示全部楼层
悲观锁定解决方案

--  我们只要对上边的代码做微小的改变就可以实现悲观的锁定.

declare @CardNo varchar(20)
Begin Tran

       --  选择一张未使用的卡
        select top 1 @CardNo=F_CardNo
        from Card   with (UPDLOCK)  where F_Flag=0
        
        --  延迟50秒,模拟并发访问.
        waitfor delay '000:00:50'

       --  把刚才选择出来的卡进行注册.

        update Card
        set F_Name=user,
            F_Time=getdate(),
            F_Flag=1
        where F_CardNo=@CardNo

commit
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表