我在GAE-Projekt中使用了GoogleCloudStorage,我想知道当我同时访问两个实例时会发生什么。我创建了一个PHP脚本,它打开一个文件,读取它的内容,添加一些内容并保存它:
$userContent = json_decode(file_get_contents("*** link ***"));
$userContent->abc = "test"; // Do some changes
file_put_contents("*** link ***", json_encode($userContent);
我担心的是,当我打开文件时,另一个实例也会打开它,数据会丢失。那么在这种情况下会发生什么?
答案 0 :(得分:6)
谷歌云存储本身并没有锁定。对GCS对象的读取和写入都是原子 - 每次读取都将完全从一个版本获取对象的内容;每次写入都将完全取代对象。没有“中间阶段”(部分对象来自一个版本,其余部分来自另一个版本)可能存在。
但是当然,如果多个任务试图独立地“修改”一个GCS对象并且不知何故在它们之间进行同步或协商,那么 很可能“丢失数据”!这是因为GCS没有“修改”对象的概念:只有读取对象,完全替换对象。
因此,尝试“修改”GCS对象的任务实际上会读取它,修改它在内存中的任何内容,然后用该内存的内容覆盖该对象。如果多个任务独立地“覆盖”同一个对象,则最后一次覆盖将“赢”,并删除之前的任务。
我不知道“GAP-Projekt”是什么,但假设我们实际上在讨论GAE(根据标签),使用共享资源,GAE应用的多个实例之间相互同步是相当容易的例如memcache或GAE数据存储区。根据惯例,这些资源将用于表示“当前拥有”GCS对象的实例;另一个实例会等待...
答案 1 :(得分:2)
没有锁定 - 如果您同时以不同方式修改数据,那么您的数据可能会丢失。
答案 2 :(得分:1)
也可以依赖 GCS preconditions
这仅允许在读取后未更改的情况下更新文件。查看文档:
<块引用>前置条件通常用于改变请求——上传、删除、复制或元数据更新——以防止竞争条件。当重复发送相同的请求或独立的进程相互干扰时,可能会出现竞争条件。例如,网络中断后的多次请求重试,或者用户对同一个对象执行读-修改-写操作都会产生竞争条件。