锁定文件以更新一部分数据或所有文件内容

时间:2019-05-02 07:35:53

标签: go locking race-condition file-locking

我的文件可以从多个过程中进行更新,因此我想使用锁定并找到 https://github.com/gofrs/flock可能有帮助

但是我认为问题有点复杂,例如,更新api之前需要读取的文件/部分(我们提供api来读取fileapplication的{​​{1}}个对象)
获取json数据,在内存中对其进行修改并更新文件。

有两个选项:

  1. 更新所有文件内容
  2. 更新文件上的部分,即一个 应用程序属性

问题如下:

name

此外,相同的情况对所有文件上下文均有效

1. Process A & Process B (can be more…) Reads the object of application name `node1` 2. Process A update the section (node1) with new data (for example change the kind property and update) 3. Process B want to do the same , the problem is that between the time it reads the data and the time it wants to update ,the data is not valid since other process already update it. 条件问题…

这是文件的简短示例,某些Race进程可以在任何给定时间更新

stateless

我们如何克服这个问题,或者简化它以避免种族状况和勾结?

3 个答案:

答案 0 :(得分:1)

可以使用多种方法来解决此问题。

1) 使用锁
您可以创建读写锁。如果某个进程只想读取文件,则可以获取读取锁。如果某个进程要写,则它会获得写锁,而其他进程则必须等到释放写锁之后。

使用版本控制
您可以保留一个计数器以跟踪版本。 在写入文件的方法中,仍然需要锁定。

初始版本1.
进程B读取文件,请参见版本1。
进程A读取文件,看到版本1,然后写入,将版本增加到2,然后更新文件。
因此,现在在编写之前,进程B将比较版本。由于其版本(版本1)小于当前版本(版本2),因此它将不得不中止/重试其操作。

仅当文件内容与读取的内容相同时,该过程才应更新文件。您可以按照peterSO在他的回答中建议的方式来实现。

答案 1 :(得分:1)

我在注释中的建议仍然有效:您描述的用例通常由数据库实现。他们旨在解决这个问题。

但是,如果您必须使用此YAML文件,则可以像这样实现您的写入操作:

  1. 创建一个锁。
  2. 通过读取文件
  3. 更新
  4. 执行内存中的更改。
  5. 写回文件。
  6. 释放锁。

这可确保没有更新过时的数据。

答案 2 :(得分:1)

这是一个常见问题,因此请寻找已知的解决方案。例如,乐观锁定。

类似这样的伪代码:

lock file for read
read file into data1
release file lock
hash data1 as hash1
update data1
lock file for update
read file into data2
hash data2 as hash2
if hash1 != hash2
    release file lock
    return error
write file from (updated) data1
release file lock
return success