我有两个数据库表:visitors
和passes
。访问者包含pass_id
的字段,该字段引用passes
表中的一个记录。
传递表预先填充了有效传递列表。
每位访客必须在抵达时随机分配一个通行证ID,期望不会为其他访客分配相同的ID(直到相关的访客记录被注销)。
天真的解决方案只是执行find()
来提取随机未分配的传递ID,然后将该ID传递到后续的save()
值,但这并不会阻止相同的传递偶然分配多次(特别是当并发用户数增加或者可用传递池变小时)。
在纯MySQL实现中,我会在INSERT
中进行子查询,这样两个操作都会立即发生,而不是发生在两个不连续的DB调用中。 The relevant MySQL documentation清楚地表明单独的事务不会阻止在SELECT
查询后发生外部数据库更改,所以我不能使用Cake的内置事务支持。
同样在纯MySQL中,我可以使用触发器动态获取值(甚至不通知Cake)但如果我耗尽可能的通行证ID列表,我希望能够显示有意义的错误而不是获取保存时SQL插入失败(如果可能的话,我们希望保持与数据库无关)。
是否可以在CakePHP中很好地完成此操作而无需使用Model::query()
?