领域驱动中关于并发问题怎么处理

14-06-21 Bisu

比如我要新增一个User,要求用户名不能重复,以前用触发器,应该没有问题,现在再仓储中先判断再新增,感觉有可能会出问题

banq
2014-06-22 18:34

2014-06-21 12:04 "@Bisu"的内容
现在再仓储中先判断再新增,感觉有可能会出问题 ...

使用基于Java等语言的并发功能,在内存中比如Redis中进行判断。不过针对用户名这种组合式问题,应该还可以辅助一下一些优化算法,比如能不能将某个名带头的用户名可以使用的事前总结一下,新注册用户就如填空题一样只要填可以用的就可以了。

以上只是简单想法。

tangxuehua
2014-06-25 09:34

以前你怎么实现的,现在还是可以怎么实现啊;如果是经典DDD,那你的仓储的实现类里就是访问db的,比如你可以对user表的username创建唯一索引,或者你还是用你的触发器也可以啊。没人规定用户名唯一必须要先查出来,判断没有再插入这样的做法来保证用户名唯一。严谨的用户名唯一,只能由db来保证,唯一索引。

或者,你可以通过设计一个注册流程。先创建一个registration对象,创建时判断用户名是否重复,如果不重复,则confirm该registration对象,confirm成功后再创建用户账号,创建账号时就不必做唯一性检查了,因为前面检查过了;如果创建registration对象失败,遇到用户名重复,那就认为注册失败了,账号也不会创建,直接提示用户用户名重复就好了。这样的好处是,真正的用户账号表中不会出现注册过程相关的状态,相当于通过设计一个registration对象来显式表达注册过程,registration成功再创建account。