背景
多用户系统会出现并发问题,应对并发问题的两种方式是“悲观锁”和“乐观锁”,多数情况下都会采用“乐观锁”,这引发了一个问题,如果检查出乐观并发异常如何重试?是让最终用户手工重试?还是让系统自动重试?如何做出这个决策?本文就给我的一点想法。
想法虽小,记下来不容易忘。
何时选择:让最终用户手工重试
如果并发修改涉及的数据是用户直接参与修改的,就让用户手工重试。
注:因为用户重试一般是另外一个独立的请求,编程上比较容易处理,服务器只需要抛出并发异常即可。
何时选择:让系统自动重试
如果并发修改涉及的数据不是用户直接参与修改的,就让系统自动重试。
注:因为自动重试是在一个独立的请求,编程上需要注意一个问题:自动重试前必须重置上下文状态,如:修改的DbContext需要重置。
伪代码示例
1 private void Do() 2 { 3 try 4 { 5 //执行业务逻辑 6 } 7 catch(并发异常 ex) 8 { 9 清空状态() 10 Do() 11 } 12 }
备注
还是那句话:想法虽小,记下来不容易忘。