服务端的TigerApi 框架,基于.NET6 2024 版本
编辑 | blame | 历史 | 原始文档

Transaction结构分析

1. 事务基础架构

项目采用了分层的事务处理架构,主要包括以下几个层次:

1.1 基础接口和类

  • ITransaction接口:定义了所有事务的基本行为和属性,包括事务ID、锁机制、历史记录管理等。
  • TransactionBase抽象类:实现了ITransaction接口,提供了事务的基础功能,如历史记录管理、事务关闭和资源释放等。

1.2 领域特定事务接口和基类

  • IMESTransaction/IWMSTransaction接口:继承自ITransaction,为特定领域(MES/WMS)定义事务行为。
  • MESTransactionBase/WMSTransactionBase类:继承自TransactionBase,实现了领域特定的事务基础功能。

1.3 具体业务事务类

  • 各种具体的业务事务类(如InReceipt、OutSale、LoadingMaterial等):继承自领域特定的事务基类,实现具体业务逻辑。

2. 事务管理机制

2.1 事务创建和管理

  • BizContext:维护全局的事务字典(TransactionDic),管理所有活动的事务实例。
  • WMSContext/MESContext:管理特定领域的事务,提供事务创建和查询功能。

2.2 事务生命周期

  1. 创建:通过Controller调用相应的Init方法初始化事务,并通过Context.NewTransaction注册到事务字典中。
  2. 使用:通过事务ID从事务字典中获取事务实例,执行业务操作。
  3. 关闭:调用Close方法关闭事务,可选择是否保存历史记录。
  4. 释放:通过Dispose方法释放资源,并从事务字典中移除。

3. 事务同步和并发控制

3.1 事务锁

  • 每个事务实例都有一个TransLock对象,用于同步访问。
  • 在Controller中,非异步操作通过lock(trans.TransLock)确保事务操作的原子性。

3.2 客户端唯一性控制

  • 创建事务时可以指定IsUniqueInSameClient参数,控制同一客户端是否只能有一个同类型的事务。
  • 如果设置为true,会关闭同一客户端已有的同类型事务。

4. 事务历史记录

4.1 历史记录管理

  • 事务会记录所有API调用的历史,包括请求和响应信息。
  • 通过AddHistory方法添加历史记录,SaveHistory方法将历史保存到文件。

4.2 日志记录

  • 事务操作会记录详细的日志,包括创建、关闭和异常情况。
  • 日志文件保存在应用程序目录的Logs/Transaction文件夹中。

5. 事务超时处理

  • 系统通过配置文件设置事务超时时间(Transaction:TimeoutHours)。
  • 事务记录最后操作时间(LastActionTime),可用于判断事务是否超时。

6. 事务使用模式

6.1 Controller中的事务使用模式

  1. 获取/创建事务
    csharp if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID)) { trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IInReceipt; } else { trans = AutoFacContainer.Instance.Resolve<IInReceipt>().Init(action.ID, action.Data?.USER_CODE, Request.Host.Value, action.Data?.ORG_CODE); iBiz.WMS.Context.NewTransaction(HttpContext, trans); }

  2. 执行事务操作
    csharp if (action.IsAsync) { response = action.GetResponse(await trans.ScanItem(action.Data)); } else { lock (trans.TransLock) { response = action.GetResponse(trans.ScanItem(action.Data).Result); } }

  3. 记录历史并返回结果
    csharp trans?.AddHistory(Request, action); return Ok(response);

6.2 事务初始化模式

public IInReceipt Init(string id, string userCode, string apiHost, string orgCode)
{
    TransID = id;
    UserCode = userCode;
    ApiHost = apiHost;
    OrgCode = orgCode;
    Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
    return this;
}

7. 事务的优势和特点

  1. 状态维护:事务可以在多个请求之间维护状态,适合需要多步骤完成的业务流程。
  2. 并发控制:通过事务锁机制确保同一事务的操作不会并发执行,保证数据一致性。
  3. 历史记录:完整记录事务的所有操作,便于审计和问题排查。
  4. 资源管理:事务完成后自动释放资源,避免资源泄漏。
  5. 领域分离:通过不同的事务基类(MESTransactionBase/WMSTransactionBase)实现领域逻辑分离。

8. 总结

项目的Transaction结构采用了面向对象的设计模式,通过接口和抽象类构建了灵活的事务处理框架。这种设计使得事务处理逻辑与业务逻辑分离,便于维护和扩展。同时,通过事务字典和锁机制,确保了事务操作的安全性和一致性。

这种事务模式特别适合需要跨多个请求维护状态的复杂业务流程,如仓库管理、生产管理等领域。通过事务机制,可以有效管理这些长时间运行的业务流程,确保数据的一致性和完整性。