基于Eventual2PC的最终一致性二阶段提交实现,用于ENode。
最终一致性二阶段提交范式,参见 Eventual2PC
dotnet add package ENode.Eventual2PC
// 银行账号(转账事务的参与者)
public BandAccount : ENode.Eventual2PC.TransactionParticipantBase<string>
{
// 抽象方法实现
}
// 转账事务(转账事务的发起者)
public TransferTransaction : ENode.Eventual2PC.TransactionInitiatorBase<TransferTransaction, string>
{
// 抽象方法实现
}
-
1)抽象类标记为可序列号;
-
2)TransactionInitiatorAlsoActAsOtherParticipantBase 添加虚属性 PreventPreCommitOrNotIfTransactionProcessing
- 1)TransactionInitiatorAlsoActAsOtherParticipantBase 在PreCommit如果已经发起事务,将发布AlreadyStartTransactionWhenPreCommitDomainException 领域异常(原是ApplicationException,不合理,因为这个属于业务操作产生,非程序bug)
- 实现 Eventual2PC 1.1版本的Command接口
-
1)修复
Initiator
在执行AddPreCommitFailedParticipant
时,如果所有预提交已添加且都失败,将无法触发事件TransactionCompleted
-
2)将类
TransactionInitiatorAlsoActAsOtherParticipantBase
继承自TransactionInitiatorBase
来简化代码
-
1)
TransactionInitiatorBase
添加校验逻辑,以符合Eventual2PC
中的规约描述 -
2)新增
TransactionInitiatorAlsoActAsOtherParticipantBase
,以满足一个聚合根实例既是事务A的Initiator
, 又是事务B的Participant
的场景 -
3)小重构,将事件接口替换为抽象类,目的是为了减少使用方的编码量
- 1)修复
TransactionInitiatorBase
、TransactionParticipantBase
内部处理
- 1)修复
TransactionParticipantBase
内部处理
- 1)修复
TransactionInitiatorBase
- 1)取消自定义接口
ITransactionPreparation
- 1)增加
PreCommitFailed
的领域异常接口ITransactionParticipantPreCommitDomainException
- 初始版本