事务

    事务作为一个完整的工作单元执行,事务中的操作要么全部执行成功要么全部执行失败。SequoiaDB事务中的操作只能是插入数据、修改数据以及删除数据,在事务过程中执行的其它操作不会纳入事务范畴,也就是说事务回滚时非事务操作不会被执行回滚。如果一个表或表空间中有数据涉及事务操作,则该表或表空间不允许被删除。

    中,关于事务启停的配置项如下:

    默认情况下,SequoiaDB 所有节点的事务功能都是开启的。若用户不需要使用事务功能,可参考示例 3 全局关闭事务 的方法,关闭事务功能。

    注意:

    • 开启及关闭节点的事务功能都要求重启该节点。
    • 在开启节点事务功能的情况下,节点的配置项logfilenum(该配置项默认值为20)的值不能小于 5。

    事务操作

    SequoiaDB 事务支持的操作如下:

    • 读事务操作:QUERY。SequoiaDB的其它操作(如:创建表、创建索引、创建并读写LOB等其它非 CRUD 操作)不在事务功能的考虑范围。

    中,关于事务隔离级别的配置项如下:

    事务开启、提交与回滚

    通过 "transBegin"、"transCommit" 及 "transRollback" 方法,用户可以在一个事务中,对若干个操作进行事务控制。其使用方式如下:

    注意:该配置项只有在事务功能开启(即 transactionon 为 true )的情况下才生效。

    默认情况下,transautorollback 配置项的值为 true。所以,当写事务操作过程出现失败时,当前事务所有未提交的写操作都将被自动回滚。

    数据库配置中,关于事务自动提交的配置项如下:

    注意:该配置项只有在事务功能开启(即 transactionon 为 true )的情况下才生效。

    事务自动提交功能默认情况下是关闭的。当 transautocommit 设置为 true 时,事务自动提交功能将开启。此时,使用事务存在以下两点不同:

    • 用户不需要显式调用 "transBegin" 和 "transCommit" 或者 "transRollback" 方法来控制事务的开启、提交或者回滚。
    • 事务提交或者回滚的范围仅仅局限于单个操作。当单个操作成功时,该操作将被自动提交;当单个操作失败时,该操作将被自动回滚。

    例如,如下操作中:

    1. > /* transautocommit 设置为 true */
    2. > db.foo.bar.update({$inc:{"salary": 1000}}, {"department": "A"}) // 更新 1
    3. > db.foo.bar.update({$inc:{"salary": 2000}}, {"department": "B"}) // 更新 2
    4. > db.foo.bar.update({$inc:{"salary": 3000}}, {"department": "C"}) // 更新 3
    5. > ...

    更新 1、更新 2、更新 3 分别为独立的操作。假设更新 1 和 更新 2 操作成功,而更新 3 失败。那么更新 1 和 更新 2 修改的记录将全部被自动提交。而更新 3 修改的记录将全部被自动回滚。

    其它配置

    当用户希望调整事务的设置时(如:是否开启事务、调整事务配置项等),有如下 3 种方式供用户选择使用:

    • 修改节点配置文件

    用户可以将描述的事务配置项,配置到集群所有(或者部分)节点的配置文件中。若修改的配置项要求重启节点才能生效,用户需重启相应的节点。

    • 使用 updateConf() 命令在 sdb shell 中修改集群的事务配置项。若修改的配置项要求重启节点才能生效,用户需重启相应的节点。

    示例

    假设集群的安装目录为 "/opt/sequoiadb",协调节点地址为 "ubuntu-dev1:11810"。通过如下操作,获取 db 以及 cl 对象。

    • 使用事务回滚插入操作。事务回滚后,插入的记录将被回滚,集合中无记录:
    1. > cl.count()
    2. Return 0 row(s).
    3. > db.transBegin()
    4. > cl.insert( { date: 99, id: 8, a: 0 } )
    5. > db.transRollback()
    6. > cl.count()
    7. Return 0 row(s).
    • 使用事务提交插入操作。提交事务后,插入的记录将被持久化到数据库:
    • 全局关闭事务。

    步骤1:通过sdb shell 设置集群所有节点都关闭事务。

      步骤2:在集群每台服务器上都重启 SequoiaDB 的所有节点。