持续更新插入

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) 

【讨论】:

以上是关于持续更新插入的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL 技巧总结--持续更新

JSON 字段的更新不会持续到数据库

ConcurrentHashMap核心知识点整理(持续更新)

ConcurrentHashMap核心知识点整理(持续更新)

MySQL数据库基础(操作数据表中的记录)(持续更新中)

超详细的 MySQL 学习教程(多实例附练习视频讲解持续更新)