如何解决如果尝试操纵当前正在操纵的对象,S3会抛出什么异常?
我正在写一段代码,将S3对象从一个键复制到另一个。该代码位于API端点后面,因此有可能在复制操作正在进行时多次被调用。
据我了解,S3复制操作是原子的(根据https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectsExamples.html)。
因此,我假定如果尝试对当前要复制到的键发起复制操作,则会引发异常。可能是什么例外?
我能找到的最接近的东西是“ OperationAborted”,但我想确定的是,我自己没有触发这种情况的好方法。
解决方法
根据S3文档:
对单个键的更新是原子的。例如,如果将PUT放置到现有密钥上,则后续读取可能会返回旧数据或更新后的数据,但绝不会返回损坏或部分数据。
还请注意:
Amazon S3当前不支持对象锁定以进行并发更新。如果同时对同一个密钥发出两个PUT请求,则具有最新时间戳的请求将获胜。如果出现问题,则需要在应用程序中建立对象锁定机制。
More on the S3 consistency model.
这也许也可以解释,到目前为止,您只能通过botocore
捕获少数客户端异常(但不能捕获资源)。这些是:
- S3.Client.exceptions.BucketAlreadyExists
- S3.Client.exceptions.BucketAlreadyOwnedByYou
- S3.Client.exceptions.NoSuchBucket
- S3.Client.exceptions.NoSuchKey
- S3.Client.exceptions.NoSuchUpload
- S3.Client.exceptions.ObjectAlreadyInActiveTierError
- S3.Client.exceptions.ObjectNotInActiveTierError
有关上述内容的更多详细信息,请参见here。
换句话说,只要复制的键存在,就不应有任何异常,因为您可以同时访问它并将其复制到需要的位置。
另一方面,如果您如上所述继续更新复制的密钥,则可能最终会复制陈旧数据,因为S3最终为覆盖所有区域中的PUTS和DELETES提供了一致性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。