SmartESQL事务管理
所有 SmartEDB 数据库操作均在事务上下文中执行。
对于读取操作,系统会自动启动一个只读事务,并在读取完成后提交或回滚该事务。同样地,所有的数据库更新操作(包括 INSERT、UPDATE 和 DELETE)均在读写事务中进行,操作完成后亦会提交或回滚。
这种事务管理机制由查询和更新语句隐式处理。当调用 mcosql_execute_query()
或 mcosql_execute_prepared_query()
函数且事务句柄(即第二个参数)为 NULL
时,运行时将自动启动并关闭一个只读事务。类似地,调用 mcosql_execute_statement()
或 mcosql_execute_prepared_statement()
函数时,运行时也会自动启动并关闭一个读写事务。
若应用程序需要将多个 SQL 语句组合在一个数据库事务中,则必须显式地管理事务。具体而言,需首先调用 mcosql_begin_transaction()
函数以开启事务,该函数返回一个事务句柄;随后,在所有 SQL 语句执行完毕后,使用 mcosql_commit_transaction()
或 mcosql_rollback_transaction()
函数来结束事务。
函数的具体实现如下:
mcosql_begin_transaction(
database_t database,
transaction_t* trans,
enum mcosql_transaction_mode mode,
int priority
);
- trans :返回有效的事务,若无法启动事务则返回错误代码。
- mode:指定事务类型:
MCO_READ_ONLY
或MCO_READ_WRITE
。 - priority:指定事务优先级,应始终为
MCO_TRANS_FOREGROUND
。有关事务处理和优先级管理的详细说明,请参阅并发控制页面。
mcosql_commit_transaction()
和 mcosql_rollback_transaction()
这两个函数仅需要一个有效的事务句柄参数。定义如下:
mcosql_commit_transaction(transaction_t trans);
mcosql_rollback_transaction(transaction_t trans);
检查点和自动检查点
在复杂的事务中,可能需要执行检查点操作,以便在事务提交之前更新索引。mco_trans_checkpoint()
函数用于触发检查点,也可以使用以下 SQL 语句来触发检查点:
executeStatement("CHECKPOINT TRANSACTION");
要启用自动检查点功能,请在数据库参数 mco_db_params_t.mode_mask
中设置 MCO_DB_SQL_AUTOCHECKPOINT
标志。例如:
int main(int argc, char* argv[])
{
...
mco_db_params_t db_params;
...
mco_db_params_init( &db_params ); /* Initialize the params with default values */
...
db_params.mode_mask = MCO_DB_SQL_AUTOCHECKPOINT;
...
}
隔离级别
可以通过调用扩展版本的 mcosql_begin_transaction_ex()
函数来设置事务的隔离级别,
mcosql_begin_transaction_ex(
database_t database,
transaction_t* trans,
enum mcosql_transaction_mode mode,
int priority,
enum mcosql_transaction_isolation_level level
);
升级事务
可以通过调用以下内容,将为查询启动的只读事务升级为在同一事务内用于更新数据的读写事务。
mcosql_upgrade_transaction(transaction_t trans);
释放事务
当事务块完成,应通过调用以下函数“释放”事务句柄,以释放与此事务相关的所有资源。
mcosql_release_transaction(transaction_t trans);