持续更新插入
Posted
技术标签:
【中文标题】持续更新插入【英文标题】:Upsert in persistent 【发布时间】:2013-12-12 19:56:12 【问题描述】:如何在持久化中进行原子更新插入?
还没有找到一种方法来使用持久性 API 执行 upsert、插入或更新操作。 insertBy 之后的更新之类的东西似乎是最接近的东西。但如果我没有理解错误,这将不是原子的,因此很容易出现竞争条件。
【问题讨论】:
我没有答案,但这里有一些有用的事实可能会让你更接近 - 根据yesodweb.com/book/persistent,单个 runSqlite 调用中的所有内容都是事务性的(这只是 sqlite,但page 向我暗示,如果您翻转一个数据库并放入另一个数据库,这将保持不变)。此外,upsert/merge 似乎是 SQL 规范的新增内容,不同的数据库似乎仍在以不同的方式实现该功能。上面的 URL 中还有一个关于实现自定义数据库特定查询的部分,所以也许你可以使用它。 +jamshidh 关于事务的评论在这里很重要:因为你在一个事务中做所有事情,所以多个操作将是原子的,至少对于所有 SQL 后端。 那么对于那些不支持事务的后端有特殊的更新API吗? Persistent2 似乎支持 upsert。 【参考方案1】:persistent
的最新版本支持upsert
:
upsert :: (MonadIO m, PersistEntityBackend val ~ backend, PersistEntity val)
=> val -> [Update val] -> ReaderT backend m (Entity val)
【讨论】:
以上是关于持续更新插入的主要内容,如果未能解决你的问题,请参考以下文章
ConcurrentHashMap核心知识点整理(持续更新)