在我现在正在进行的项目中,我们面临着我们所说的挑战。挑战有成员和参与者。成员是有权访问挑战的每个人(可以是单个用户或用户组),参与者跟踪每个用户的参与统计信息。
每次添加新的挑战成员时,都会重新计算挑战参与者。这基于事件发生,因此挑战成员触发一个created
事件,挑战参与者监听该事件。
当同时创建两个挑战成员时会出现问题,这意味着该事件也被触发了两次,并且代码的两次执行同时运行。为了显示:
challenge.getMembers();
challenge.getParticipants();
// calculations
foreach member not in participants, create participant
如前所述,当上述代码同时运行时会出现问题,更具体地说,当第二次执行getParticipants
在第一次执行之前到达时,参与者条目丢失了。两次执行都看到一些参与者丢失,并创建它们。这意味着我们现在有一些用户的挑战参与者重复条目。
现在我们解决这个问题的方法是challenge_id, user_id
在挑战参与者上有一个唯一的索引。但是在违反约束时忽略错误确实感觉有点脏。这也使得检查其他 SQL 错误变得更加困难,因为所有错误都只是传递给回调,然后我们必须检查错误字符串的内容以查看它是否是我们喜欢的错误(违反唯一性),或者我们不喜欢的错误(例如语法错误),应该处理。
此代码将在多个服务器上运行,因此即使使用 mutice,我们也不能保证代码不会同时运行。我们也不介意它同时运行不同的挑战,只要它不同时运行相同的挑战。有没有人有处理这种类型的并发合并的建议?