设计思路
- 对象创建:使用C#的记录类型(Record),记录类型默认是不可变的,非常适合用于金融交易这种需要数据不可变保证的场景。通过定义包含所有交易属性的构造函数来创建对象实例。
- 对象更新:由于记录类型不可变,更新操作实际上是创建一个新的记录实例,并将需要改变的属性值传入新实例的构造函数。
- 高并发性能优化:
- 线程安全的数据结构:使用线程安全的集合来存储交易记录,如
ConcurrentDictionary
。这可以避免在多线程环境下的竞争条件。
- 不可变数据结构:记录类型的不可变性天然避免了由于数据修改导致的并发问题。
- 减少锁的使用:尽可能使用无锁数据结构和算法,减少锁带来的性能开销。
关键代码片段
// 定义交易双方信息记录类型
public record PartyInfo(string Name, string AccountNumber);
// 定义交易记录记录类型
public record TransactionRecord(
Guid TransactionId,
DateTime TransactionTime,
decimal TransactionAmount,
PartyInfo Sender,
PartyInfo Receiver
);
// 使用线程安全集合存储交易记录
private static readonly ConcurrentDictionary<Guid, TransactionRecord> TransactionDictionary = new();
// 创建交易记录方法
public static void CreateTransaction(
Guid transactionId,
DateTime transactionTime,
decimal transactionAmount,
PartyInfo sender,
PartyInfo receiver
)
{
var transaction = new TransactionRecord(
transactionId,
transactionTime,
transactionAmount,
sender,
receiver
);
TransactionDictionary.TryAdd(transactionId, transaction);
}
// “更新”交易记录方法(实际为创建新记录)
public static void UpdateTransaction(Guid transactionId, decimal newAmount)
{
if (TransactionDictionary.TryGetValue(transactionId, out var oldTransaction))
{
var newTransaction = oldTransaction with { TransactionAmount = newAmount };
TransactionDictionary.TryUpdate(transactionId, newTransaction, oldTransaction);
}
}