为了账号安全,请及时绑定邮箱和手机立即绑定

幂等操作与非幂等操作:Java编程中的关键概念解释

在Java中,幂等和非幂等的概念主要在于它们如何处理相同输入的重复调用。理解这些概念对于设计稳健的API来说尤其重要,特别是在与远程服务或数据库交互的时候。

幂等性操作

一个幂等操作是可以多次执行而不会产生额外效果的操作。换句话说,执行一次或多次操作的结果是一样的。特别是在分布式系统中,这一点尤为重要,因为在网络故障的情况下,可能导致请求被重复发送。

HTTP 方法(例如): 在 REST API 中,GETPUTDELETE 方法都被认为是幂等的。

示例情景:

  • HTTP DELETE 请求:想象一个 RESTful API 用于删除用户的账户。如果你多次向 /users/123 发送 DELETE 请求,第一次发送的请求会成功删除 ID 为 123 的用户。任何后续的 DELETE 请求将不再有任何影响,因为用户已经不存在了。因此,这个操作具有幂等性。
    // 幂等的 DELETE 请求  
    @DeleteMapping("/users/{id}")  
    public ResponseEntity<Void> deleteUser(@PathVariable String id) {  
        userService.deleteUserById(id);  
        return ResponseEntity.noContent().build();  
    }

    // 注释:幂等的操作意味着多次执行该操作与一次执行的效果相同。
场景说明:HTTP DELETE 请求场景

删除请求 : DELETE /users/123

开始行动

  1. 第一个请求是:你发送一个 DELETE 请求来删除 ID 为 123 的用户。
  • 输出:用户删除成功,服务器可能会返回这样的状态码,例如 204 No Content

2. 第二个请求:再次发送同样的DELETE请求就可以了。

  • 输出结果:服务器再次尝试删除用户,但由于用户已经不存在了,可能会返回 404 Not Found 这样的状态码。

整体输出的解释

  • 第一次执行会删除用户(用户已被删除)。
  • 之后的执行不会进一步改变状态(用户已删除),因此在第一次操作之后,输出保持一致。这就是为什么删除操作具有幂等性。
非幂等操作(如发送短信操作)

另一方面,非幂等的运作 每次执行都会改变状态,这意味着重复相同的输入会得到不同的结果。这一点尤其重要,因为这可能导致重复操作时出现意外的副作用。

HTTP 方法: POST 方法一般不具备幂等性。例如,POST /resource 每次调用都会创建一个新的资源实例,重复调用会导致多个实例的存在。

示例情景:

  • HTTP POST 请求:考虑一个用于创建新用户账户的 API。每次你向 /users 发送 POST 请求, ,它会创建一个具有唯一标识符的新用户账户。如果你多次发送相同的 POST 请求,你将会创建多个用户账户,从而导致不同的结果和情况。
    // 非幂等的 POST 请求  
    @PostMapping("/users")  
    public ResponseEntity<User> createUser(@RequestBody User user) {  
        User createdUser = userService.createUser(user);  
        return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);  
    }
场景:HTTP POST 请求

请求方法: POST /users

执行:

  1. 第一个请求是:你发出一个 POST 请求来创建一个具有具体信息的新用户账号。
  • 输出:用户已被创建,服务器可能会返回一个状态码如 201(创建成功),并包括一个独一无二的用户ID。

2. 第二次请求:再次使用相同的用户详细信息发送相同的 POST 请求内容。

  • 输出结果:创建了一个具有不同的唯一ID的新用户,服务器再次响应201 Created和新用户的详细信息。
输出总结
  • 在幂等操作中,输出在第一次执行后就稳定了,因为再执行也不会改变结果(例如,删除一个已被删除的资源)。
  • 在非幂等操作中,每次执行都会产生不同的输出,每次调用都会创建新的资源,每次调用都会改变状态(例如,每次调用都会创建新的资源)。

如果你觉得这些文章有用,请考虑多点几个赞 __👏__ ,并把它分享给你的朋友和同事。以后需要时可以参考。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消