增加事件驱动和业务回滚处理方式
This commit is contained in:
147
app/transaction.c
Normal file
147
app/transaction.c
Normal file
@ -0,0 +1,147 @@
|
||||
/*
|
||||
* transaction.c
|
||||
*
|
||||
* Created on: 2026-03-04
|
||||
* Author: RT-Thread
|
||||
*
|
||||
* 功能: 事务管理模块实现
|
||||
* 依赖: RT-Thread Nano, osal
|
||||
* 跨平台适配: 基于RT-Thread Nano,使用标准API
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include "osal.h"
|
||||
#include "transaction.h"
|
||||
|
||||
/* 事务数组 */
|
||||
static transaction_t g_transactions[MAX_TRANSACTIONS];
|
||||
|
||||
/**
|
||||
* @brief 初始化事务管理
|
||||
* @return 0 成功,非0 失败
|
||||
*/
|
||||
int transaction_init(void)
|
||||
{
|
||||
/* 初始化事务数组 */
|
||||
for (int i = 0; i < MAX_TRANSACTIONS; i++)
|
||||
{
|
||||
g_transactions[i].id = 0;
|
||||
g_transactions[i].status = TRANSACTION_STATUS_IDLE;
|
||||
g_transactions[i].rollback_func = NULL;
|
||||
g_transactions[i].user_data = NULL;
|
||||
}
|
||||
|
||||
osal_log_i("Transaction management initialized");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 开始事务
|
||||
* @param rollback_func 回滚函数
|
||||
* @param user_data 用户数据
|
||||
* @return 事务ID,失败返回0
|
||||
*/
|
||||
int transaction_begin(transaction_rollback_func_t rollback_func, void *user_data)
|
||||
{
|
||||
/* 查找空闲事务 */
|
||||
int id = 0;
|
||||
for (int i = 0; i < MAX_TRANSACTIONS; i++)
|
||||
{
|
||||
if (g_transactions[i].status == TRANSACTION_STATUS_IDLE)
|
||||
{
|
||||
id = i + 1; /* 事务ID从1开始 */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (id == 0)
|
||||
{
|
||||
osal_log_e("No free transaction available");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 初始化事务 */
|
||||
g_transactions[id - 1].id = id;
|
||||
g_transactions[id - 1].status = TRANSACTION_STATUS_ACTIVE;
|
||||
g_transactions[id - 1].rollback_func = rollback_func;
|
||||
g_transactions[id - 1].user_data = user_data;
|
||||
|
||||
osal_log_i("Transaction %d started", id);
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 提交事务
|
||||
* @param id 事务ID
|
||||
* @return 0 成功,非0 失败
|
||||
*/
|
||||
int transaction_commit(int id)
|
||||
{
|
||||
if (id < 1 || id > MAX_TRANSACTIONS)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
transaction_t *tx = &g_transactions[id - 1];
|
||||
if (tx->status != TRANSACTION_STATUS_ACTIVE)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 提交事务 */
|
||||
tx->status = TRANSACTION_STATUS_IDLE;
|
||||
tx->rollback_func = NULL;
|
||||
tx->user_data = NULL;
|
||||
|
||||
osal_log_i("Transaction %d committed", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 回滚事务
|
||||
* @param id 事务ID
|
||||
* @return 0 成功,非0 失败
|
||||
*/
|
||||
int transaction_rollback(int id)
|
||||
{
|
||||
if (id < 1 || id > MAX_TRANSACTIONS)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
transaction_t *tx = &g_transactions[id - 1];
|
||||
if (tx->status != TRANSACTION_STATUS_ACTIVE)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 执行回滚函数 */
|
||||
if (tx->rollback_func != NULL)
|
||||
{
|
||||
osal_log_i("Rolling back transaction %d", id);
|
||||
tx->rollback_func(tx->user_data);
|
||||
}
|
||||
|
||||
/* 重置事务状态 */
|
||||
tx->status = TRANSACTION_STATUS_IDLE;
|
||||
tx->rollback_func = NULL;
|
||||
tx->user_data = NULL;
|
||||
|
||||
osal_log_i("Transaction %d rolled back", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取事务状态
|
||||
* @param id 事务ID
|
||||
* @return 事务状态
|
||||
*/
|
||||
transaction_status_t transaction_get_status(int id)
|
||||
{
|
||||
if (id < 1 || id > MAX_TRANSACTIONS)
|
||||
{
|
||||
return TRANSACTION_STATUS_INVALID;
|
||||
}
|
||||
|
||||
return g_transactions[id - 1].status;
|
||||
}
|
||||
Reference in New Issue
Block a user