当前位置: 首页 > 知识库问答 >
问题:

java - 问大家一个Java逻辑问题?

訾淇
2023-06-28

现在项目里有个逻辑关于数据流程状态的,两个用户在各自客户端同一个审核页面操作更新同一条数据,用户A做审核通过,用户B再审核驳回。

现有的方案是两边接口都传待审核的状态过去给接口校验,用户B点的审核页可能会获取最新数据状态,但也要存下其他用户操作前的待审核状态,我觉着这太麻烦了不符合逻辑,直接接口里拿最新的数据状态和要操作的类型比对不就行了,大家怎么看这种逻辑是否合适?

共有3个答案

陶温书
2023-06-28

很常见的多人编辑冲突问题。

常见的解决方案就那么几种,具体还是要结合业务场景来选择。

  1. 悲观锁:
    只能有一个人进入编辑状态,其他人等着。
    优点是能百分百确保不会出现编辑冲突。缺点就是用户体验很差,前一个人不主动释放,那所有人都得等着,只适合 Wiki 锁定编辑之类的场景。
  2. 乐观锁:
    每条数据记录一个版本信息(比如叫 row_version),客户端获取时拿到它,提交修改时一并传回去。服务端 UPDATE 时增加 WHERE 条件 row_version=request.row_version,并且同时更新 row_version(比如 +1)。这样后提交的请求因为 row_version 与数据库值不同就不会更新。
    优点是实现起来超级简单。但缺点就是只适合简单场景,如果是一个复杂表单,几十个字段那种,后提交的用户你不让他更新入库倒是行,但你也不能就把人家辛辛苦苦填的东西给直接丢了,那用户得疯。所以要想用户体验好,就还得配合前端实现数据恢复的相关逻辑(比如重新拉一次最新数据,然后 diff 差异给出提示之类的,具体的看业务需求)。
  3. 版本合并:
    这个不展开了,比较复杂。一般适用于在线文档之类的场景。
  4. 协同编辑
    在版本合并的基础上引入增量 diff 和 WebSocket。适用场景同上。
莘钧
2023-06-28

前端传要改变成的状态,后端校验当前状态是否能够改变,不能改变则返回相应错误信息,前端展示

穆建元
2023-06-28

是拿最新的数据状态,和当前要操作的类型进行比对

 类似资料:
  • 我有一个搜索类型的下拉框,可以输入关键字来缩小范围,但如图1所示名称可能会重复,所有我想再将地址加入模糊匹配,例如传:阿三 成都,空格分开。 后端的朋友说不好实现是为什么?在调SQL之前将字符串切割后再调SQL匹配不行吗?

  • 问题内容: 为什么在下面的程序中不执行func3?在func1之后,不需要对func2进行评估,但是对于func3,不是吗? 问题答案: 您正在使用短路或。如果第一个参数为true,则整个表达式为true。 如果添加编译器使用的隐式括号可能会有所帮助 编辑 :正如Chris Jester-Young所说,这实际上是因为逻辑运算符必须从左到右的关联性: func1返回之后,它变为: 评估短路或后,它

  • 逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。 逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体如表 1 所示。 表 1 逻辑运算符的用法、含义及实例 运算符 用法 含义 说明 实例 结果 && a&&b 短路与 ab 全为 true 时,计算结果为 true,否则为 false。 2>1&&3<4

  • 2(名)-约翰 3(型号)-客车 4(attr_hash)-由java哈希代码计算