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 事务生命周期
- 创建:通过Controller调用相应的Init方法初始化事务,并通过Context.NewTransaction注册到事务字典中。
- 使用:通过事务ID从事务字典中获取事务实例,执行业务操作。
- 关闭:调用Close方法关闭事务,可选择是否保存历史记录。
- 释放:通过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中的事务使用模式
获取/创建事务:
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); }
执行事务操作:
csharp if (action.IsAsync) { response = action.GetResponse(await trans.ScanItem(action.Data)); } else { lock (trans.TransLock) { response = action.GetResponse(trans.ScanItem(action.Data).Result); } }
记录历史并返回结果:
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. 事务的优势和特点
- 状态维护:事务可以在多个请求之间维护状态,适合需要多步骤完成的业务流程。
- 并发控制:通过事务锁机制确保同一事务的操作不会并发执行,保证数据一致性。
- 历史记录:完整记录事务的所有操作,便于审计和问题排查。
- 资源管理:事务完成后自动释放资源,避免资源泄漏。
- 领域分离:通过不同的事务基类(MESTransactionBase/WMSTransactionBase)实现领域逻辑分离。
8. 总结
项目的Transaction结构采用了面向对象的设计模式,通过接口和抽象类构建了灵活的事务处理框架。这种设计使得事务处理逻辑与业务逻辑分离,便于维护和扩展。同时,通过事务字典和锁机制,确保了事务操作的安全性和一致性。
这种事务模式特别适合需要跨多个请求维护状态的复杂业务流程,如仓库管理、生产管理等领域。通过事务机制,可以有效管理这些长时间运行的业务流程,确保数据的一致性和完整性。