MongoDB的事务

少于 1 分钟阅读

contact me

或者用邮件交流 jacky.wucheng@foxmail.com

结论

原生不支持RDBMS的事务,若要,就靠第三方实现。可以自己实现,也有现成的package。

MongoDB对事务的支持

Atomicity and Transactions — MongoDB Manual 3.6说,MongoDB支持single document级别的原子性,所以官方的意思是,MongoDB支持复杂的嵌套的document,如果你需要保证多个document一起操作的原子性,一个办法是把多个document嵌套为一个document。

否则,Perform Two Phase Commits MongoDB Manual 3.6 告诉我们可以自己实现两阶段提交来模拟类似事务的语义,但依然不是我们所熟悉的RDBMS的事务。如果你需要文章的中文翻译,可以参考 MongoDB两阶段提交实现事务Acupple’s Blog

Percona TokuMX对MongoDB事务的支持

Percona TokuMX宣称几乎兼容MongoDB 2.4, 猜测是基于其代码改的,宣称支持事务,MongoDB Multi-Statement Transactions? Yes We Can! - Percona Database Performance Blog这是最初TokuMX发起Transaction feature时的文章。

后来Percona又把开发平台迁移到了Percona Server for MongoDB,且强烈建议从TokuMX迁移过来,宣称完全兼容MongoDB® Community Server,并且完全开源。但是对比feature支持对比表Percona Server for MongoDB 3.4 Documentation,居然去除了对事务的支持,理由大概是MongoDB 3.4版本设计理念发生了变化导致在其基础上实现传统的ACID模型需要大幅度修改核心代码,且会降低Percona Fractal Tree Engine(ACID的实现)的性能,并且会无法支持optimistic concurrency,所以不得已放弃了, 见此Migrate from TokuMX to Percona Server for MongoDB - Percona Database Performance Blog

所以,Percona对于MongoDB事务的支持算是终结了。

Golang的Driver对MongoDB事务的支持

driver:

实现原理:

Multi-doc transactions for MongoDB Labix Blog,用几个表来记录transaction相关的日志信息,然后实现事务的逻辑。 然而该方法目前存在 partial apply 的现象,且无法整体rollback,你只能在op里用assert语句来尽量避免这个问题,很可怜。该例子给出了测试方法。mgo/txn: one bad transaction can break the queue · Issue #98 · go-mgo/mgo该issue描述了这个问题。

所以如果我们只需要最终一致性,倒是可以考虑txn这个package,否则的话,RDBMS才是正道。

使用文档参考:txn - GoDoc

一些使用例子