• 使用事务
    • 读写事务
    • 只读事务
    • 手动管理事务

    使用事务

    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. }