事务概述

    在ZNBase中,事务是通过使用BEGIN和COMMIT语句包围SQL语句来组织的。

    可以使用 语句,也可以使用 START TRANSACTION语句来显式地开启一个新事务,两者效果相同。并通过COMMIT语句用于提交在当前事务中进行的所有修改。

    要使用客户端事务重试,还应包括S和RELEASE SAVEPOINT语句。

    示例:

    在提交之前的任何时候,都可以通过执行ROLLBACK语句来中止事务。

    显式事务和隐式事务

    ZNBase不建议在同一个显式事务中,执行DML和DDL,通过开启集群参数kv.transaction.auto_commit_ddl,会自动提交DDL之前的所有语句,将DDL作为单条语句自动执行并提交后,在开启一个新的显式事务来解决该问题。

    每个事务由两个参数控制:优先级和隔离级别。

    事务优先级

    ZNBase中的每个事务都被分配了初始优先级。 默认情况下,该优先级为NORMAL,但对于在高竞争场景中应优先考虑的事务,客户端可以在BEGIN语句中设置优先级:

    或者,客户端可以在事务启动后立即设置优先级,如下所示:

    客户端还可以使用SHOW TRANSACTION PRIORITY显示事务的当前优先级。

    现有的ZNBase支持Serializable(串行化)和Read Committed(读已提交)两种。

    或者,客户端可以在事务启动后立即设置隔离级别:

    客户端还可以使用显示事务的当前隔离级别。

    Serializable

    使用SERIALIZABLE隔离级别,事务的行为就好像它在事务执行期间独占整个数据库。 这是ZNBase提供的最高隔离级别,也是默认的隔离级别。

    Read Committed

    ZNBase中的事务在执行期间锁定写入的数据资源。当一个事务的挂起写入与并发事务的写入冲突时,并发事务必须等待先前的事务完成才能继续。当在事务之间检测到依赖性循环时,具有较高优先级的事务中止依赖事务以避免死锁,被中止事务将被重试。