gpt4 book ai didi

java - 如何检测记录被锁定时间过长?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:13 24 4
gpt4 key购买 nike

我最近在工作中被问到这个问题。

db(数据库)中有一些记录。例如,我们有 recordA、recordB、....

[库存管理]屏幕显示它们的内容。

有一些用户。我们有 userA,userB,...

数据库中的记录。

recordId ...userId....  status(locked=1, unlocked=0)
--------------------------
recordA userA 0
recordA userB 0
recordB userA 0
recordB userB 0
...

userA登录系统,在【库存管理】界面点击recordA进行编辑,recordA的状态为'locked'。

数据库中记录 A 的状态

recordId ...userId....  status(locked=1, unlocked=0)
--------------------------
recordA userA 1
recordA userB 0
recordB userA 0
recordB userB 0
...

目前userB不能修改recordA。当 userB 点击 recordA 时,它会显示错误消息“recordA is locked

现在我需要实现这个逻辑“用户 A 点击记录 A 60 秒后,如果用户没有向服务器发送任何请求。用户 B 可以点击记录 A 进行编辑

框架:Struts2、Spring-ibatis、Oracle 数据库、Java。

这是我的解决方案:

  1. 当userA进入屏幕并锁定recordA时,设置时间戳在静态 map :Map<String, Long> timeUsers = <userId, System timestamp>

  2. 每次用户(userA、userB、...)向服务器发送请求时,更新或设置每个 userId 的时间戳。

  3. 用户B进入屏幕,看到记录A的状态是锁定的。 UserB点击recordA,

    我会检查:用户 B 点击记录 A 的时间 - 用户 A 保存在静态 map 中的时间

      If(time userB click on recordA - time userA is kept in Map<String, Long> 
    )> 60 (s){

    - Update db. Change status of recordA(1->0) with userA
    - Update db. Change status of recordA(0->1) with userB
    }

    db is updated

    recordId ...userId.... status(locked=1, unlocked=0)
    --------------------------
    recordA userA 0
    recordA userB 1
    recordB userA 0
    recordB userB 0

但是我觉得不太好。用户 A 看不到记录 A 的状态已更改。将值保存在静态变量中...

有人对此有其他解决方案吗?

最佳答案

客户端的任何东西都是不好的,因为它可能会崩溃,并且如果你向外扩展就无法工作。将 status 1/0 替换为 locked_until_ts。可选地添加一个 locked_by 以便 B 可以与 A 交谈。在锁过期之前,不可能从别人那里抢锁(但可以从自己那里抢锁)。您可能希望同时添加乐观锁定的版本列。

关于java - 如何检测记录被锁定时间过长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51321029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com