事务控制
类型
所有数据库访问均在事务中进行,以下事务类型由 mco.h
中的 MCO_TRANS_TYPE
定义:
typedef enum MCO_TRANS_TYPE_E_
{
MCO_READ_ONLY = 0,
MCO_UPDATE = 1,
MCO_READ_WRITE = 2,
MCO_EXCLUSIVE = 3
} MCO_TRANS_TYPE
枚举值说明:
- MCO_READ_ONLY:对数据进行只读访问的事务。
- MCO_UPDATE:如果目的是找到一个数据库对象进行修改(
Update
或Delete
),则应该指定MCO_UPDATE
事务类型。要更新数据库对象,必须启动一个新的READ_WRITE
事务,或者必须通过调用函数mco_trans_upgrade()
升级当前事务。 - MCO_READ_WRITE:对数据进行
READ_WRITE
访问的事务。 - MCO_EXCLUSIVE:又称“全局锁”。即使事务管理器通常允许,也没有其他事务可以并行运行:在独占事务运行期间,多版本并发控制(MVCC)不允许只读或读写事务;在独占事务运行期间,多版本读已提交隔离级别(MURSIW)会推迟其他只读事务的执行(独占事务管理器忽略任何类型的事务,因为它一次只运行一个事务,而不考虑类型)。
优先级
事务调度部分由事务优先级决定。在 mco.h
中定义的枚举 MCO_TRANS_PRIORITY
如下:
typedef enum MCO_TRANS_PRIORITY_E_
{
MCO_TRANS_IDLE = -2, /* 最不重要的事务 */
MCO_TRANS_BACKGROUND = -1, /* 没有前台重要,但比空闲重要 */
MCO_TRANS_FOREGROUND = 0, /* 正常优先级事务 */
MCO_TRANS_HIGH = 1, /* 比前台任务更重要但比中断服务程序次要 */
MCO_TRANS_ISR = 2 /* 非常重要的事务 */
} MCO_TRANS_PRIORITY;
调度策略
对于具有相同优先级的事务,其事务调度策略可设置为以下值之一,这些值由 mco.h
中的枚举 MCO_TRANS_SCHED_POLICY
定义:
typedef enum MCO_TRANS_SCHED_POLICY_E_
{
MCO_SCHED_FIFO = 0, /* 先进先出 */
MCO_SCHED_READER_FAVOR = 1, /* 先运行只读事务 */
MCO_SCHED_WRITER_FAVOR = 2 /* 先运行读写事务 */
} MCO_TRANS_SCHED_POLICY;
对象状态
在一个事务中,对象可以处于由 mco.h
中的枚举 MCO_TRANS_OBJ_STATE
定义的以下状态之一:
typedef enum MCO_TRANS_OBJ_STATE_
{
MCO_TRANS_OBJ_CREATED = 0x01, /* 此对象正在创建中。 */
MCO_TRANS_OBJ_DELETED = 0x02, /* 此对象正在被删除。 */
MCO_TRANS_OBJ_ALL_DELETED = 0x04 /* 此类的所有对象都将被删除。 */
} MCO_TRANS_OBJ_STATE;
隔离级别
事务隔离级别可以是以下类型之一,这些类型由 mco.h
中的枚举 MCO_TRANS_ISOLATION_LEVEL
定义:
typedef enum MCO_TRANS_ISOLATION_LEVEL_E_
{
MCO_DEFAULT_ISOLATION_LEVEL = 0x0,
MCO_READ_COMMITTED = 0x1,
MCO_REPEATABLE_READ = 0x2,
MCO_SERIALIZABLE = 0x4
} MCO_TRANS_ISOLATION_LEVEL;
枚举值说明:
- MCO_DEFAULT_ISOLATION_LEVEL:对于多版本并发控制(MVCC),使用
MCO_REPEATABLE_READ
;对于全局锁 / MURSIW,则使用MCO_SERIALIZABLE
。 - MCO_READ_COMMITTED:保证读取的任何数据在读取时已提交。它限制了读取者看到任何未提交的数据。
- MCO_REPEATABLE_READ:除了
MCO_READ_COMMITTED
保证任何读取的数据都不会改变;如果事务再次读取相同的数据,未发生变化,并且可供读取。 - MCO_SERIALIZABLE:模拟串行事务执行。
提交策略
事务提交策略可以是以下其中一种:
typedef enum MCO_COMMIT_POLICY_E
{
MCO_COMMIT_SYNC_FLUSH, /* 每次提交时都刷新到磁盘(默认) */
MCO_COMMIT_BUFFERED, /* 运行时缓冲事务 */
MCO_COMMIT_DELAYED, /* 具有提交条件的运行时缓冲事务 */
MCO_COMMIT_NO_SYNC /* 更改不会同步写入磁盘 */
} MCO_COMMIT_POLICY;
迭代回调
当调用 mco_trans_iterate()
时,必须传递一个定义如下形式的回调函数:
typedef MCO_RET (*mco_trans_iterator_callback_t)(
mco_trans_h t, // 有效的事务句柄。
MCO_Hf* obj, // 有效的对象句柄。
int cid, // 该对象的类代码。
int obj_state, // 对象在事务中的状态,由枚举 MCO_TRANS_OBJ_STATE 定义。
void* user_ctx // 回调函数要使用的任何用户定义的上下文数据。
);
可参阅SDK示例 samples/native/core/07-transactions/iterate 中提供了迭代器回调实现的一个示例。