【问题标题】:atomic operation on window.localStoragewindow.localStorage 上的原子操作
【发布时间】:2012-12-29 02:57:21
【问题描述】:

设置 2 个或更多值时可以这样做吗?我正在使用 phonegap 并担心用户可能会在应用程序完成设置这两个值之前终止它。

我意识到我可以将 W3C web sql 与事务一起使用,但我不想因为我正在做的事情而使用 sql 的过度杀伤力。

【问题讨论】:

    标签: javascript cordova local-storage


    【解决方案1】:

    默认情况下,不,没有锁定机制。但是,您可能还想查看此question 和它引用的@​​987654322@。如果以原子方式持久化这些值对您的程序至关重要,那么您最好使用 SQL 事务。

    【讨论】:

    • 防止多次写入不是问题,所以我可能不会从那个库中得到太多。我会考虑切换到 SQL。谢谢。
    • 注意浏览器支持(对于 websql 和 indexeddb)
    【解决方案2】:

    保护写入:

    localStorage.setItem("writing", "1");
    
    localStorage.setItem("k1", "v1");
    localStorage.setItem("k2", "v2");
    ...
    
    localStorage.removeItem("writing");
    

    然后,在加载数据库时:

    if (localStorage.writing != undefined)
    {
        treat the DB as corrupted
    }
    

    【讨论】:

    • @David Wolever 您愿意为此代码提供一个失败的场景吗?
    • 我认为这可能非常接近于实际实现一种机制来检测并发环境中的损坏。 writing 标志应该包含一些唯一的标记(例如,随机数),然后最后我们应该检查它是否仍然存在。此外,我们可以在一个自动字段中存储数据的散列(例如,CRC、MD5 等)......如果我们需要处理所有更新,那么我们将不得不实现某种日志......跨度>
    • @srg: 1. Tab1 检查writing 是否未定义,并发现它是。 2. CPU 切换到 Tab2。它检查writing 是否未定义,并确定它是。然后将writing 设置为1 3. CPU 切换到Tab1。它已经看到writing 未定义,因此将writing 设置为1。然后将k1 设置为42。 4. CPU 切换到Tab2。它将k1 设置为“foobar” 5. CPU 切换到 Tab1。它从k1 读取“foobar”。
    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2011-08-10
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多