博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DDD:如何处理“唯一性”业务逻辑
阅读量:5264 次
发布时间:2019-06-14

本文共 1265 字,大约阅读时间需要 4 分钟。

背景

唯一性约束是一个经常出现的业务逻辑,刚开始我觉得非常简单,不过深入考虑后,发现实现起来还不是那么简单,下面就让我们分析一下。

两种场景下的唯一性约束

第一种场景:聚合根的某个属性的唯一性约束

示例:用户的用户名必须唯一。

第一种实现思路:后验证+不用数据库索引,在插入用户名和修改用户名之后执行一次验证,这个验证逻辑执行的事务隔离级别必须处于“读未提交”级别。

1 public volid Insert(User user) 2 { 3     using(var ts1 = new TransactionScope("读已提交")) 4     { 5         DoInsert(user); 6         using(var ts2 = new TransactionScope("读未提交")) 7         { 8             //如果违背约束,抛出异常。 9         }10         ts1.Complete();11     }12 }

 第二种实现思路:前验证+不用数据库索引,在插入用户名和修改用户名之前执行一次验证,整个事务运行在“串行化”隔离级别。

1 public volid Insert(User user)2 {3     using(var ts = new TransactionScope("串行化"))4     {            5         //如果违背约束,抛出异常。6         DoInsert(user);7         ts.Complete();8     }9 }

 第三种实现思路:前验证+数据库索引,在插入用户名和修改用户名之前执行一次验证,整个事务运行在“读已提交”隔离级别。

1 public volid Insert(User user)2  {3      using(var ts = new TransactionScope("读已提交"))4      {            5          //如果违背约束,抛出异常。6          DoInsert(user);7          ts.Complete();8      }9  }

 第四实现思路种:内存锁。

有朋友会想,为啥不直接用数据库索引呢?失败了就跑出异常,因为我们需要收集到友好的异常信息显示给UI,所以才需要在程序里判定唯一性,然后抛出友好的异常信息。

总体来说我觉得第三种思路在现实中比较方便。

 

第二种场景:聚合内某个实体的属性的唯一性约束

示例:订单的订单项的产品必须唯一。

第一种实现思路:聚合根的乐观锁+聚合自身必须保证这种约束。

我觉得这个场景下只有这一种实现是比较合理的,就不介绍其他思路了。

备注

在健身房仓促写就,大家多提意见。

 

转载于:https://www.cnblogs.com/happyframework/archive/2013/06/15/3137991.html

你可能感兴趣的文章
Oracle--通配符、Escape转义字符、模糊查询语句
查看>>
c# 文件笔记
查看>>
第一页 - 工具的使用(webstorm)
查看>>
Linux 进程资源用量监控和按用户设置进程限制
查看>>
IE浏览器整页截屏程序(二)
查看>>
D3.js 之 d3-shap 简介(转)
查看>>
制作满天星空
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
typeset shell 用法
查看>>
python 之 循环语句
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
css3学习01
查看>>
【USACO】 奶牛会展
查看>>