使用事务

NutsDB为了保证隔离性,防止并发读写事务时候数据的不一致性,同一时间只能执行一个读写事务,但是允许同一时间执行多个只读事务。
从v0.3.0版本开始,NutsDB遵循标准的ACID原则。(参见限制和警告

读写事务

  1. err := db.Update(
  2. func(tx *nutsdb.Tx) error {
  3. ...
  4. return nil
  5. })

只读事务

  1. err := db.View(
  2. func(tx *nutsdb.Tx) error {
  3. ...
  4. return nil
  5. })

手动管理事务

从上面的例子看到 DB.View()DB.Update() 这两个是数据库调用事务的主要方法。他们本质上是基于 DB.Begin()方法进行的包装。他们可以帮你自动管理事务的生命周期,从事务的开始、事务的执行、事务提交或者回滚一直到事务的安全的关闭为止,如果中间有错误会返回。所以一般情况下推荐用这种方式去调用事务

这好比开车有手动挡和自动挡一样, DB.View()DB.Update()等于提供了自动档的效果。

如果你需要手动去开启、执行、关闭事务,你会用到DB.Begin()方法开启一个事务,tx.Commit() 方法用来提交事务、tx.Rollback()方法用来回滚事务

例子:

  1. //开始事务
  2. tx, err := db.Begin(true)
  3. if err != nil {
  4. return err
  5. }
  6. bucket := "bucket1"
  7. key := []byte("foo")
  8. val := []byte("bar")
  9. // 使用事务
  10. if err = tx.Put(bucket, key, val, Persistent); err != nil {
  11. // 回滚事务
  12. tx.Rollback()
  13. } else {
  14. // 提交事务
  15. if err = tx.Commit(); err != nil {
  16. tx.Rollback()
  17. return err
  18. }
  19. }