因此,我需要基于该表中其他条目的计数安全地限制条目在表中的插入。假设我们有如下表:根据计数限制插入
资源:(ID,foreign_key)
我需要创造了多项基于外键条目。所以,只要我达到一个数字,我们就说我们的例子为100,我想限制创建更多的条目。
显而易见的答案是这样的事情:
- 数与指定的外键的条目。
- 如果计数<限制插入新的条目
而事实上,这是我一直使用的是什么。问题是,这种方法并不能防止故障,因为在1和2之间可能会出现另一次插入。我认为用交易的可能性,但(除非我完全误解交易),这有同样的问题:
- 开始交易
- 插入新的条目
- 如果条目已经超过了极限,回滚。否则提交
现在,假设我们已经有99/100个条目和两个事务同时运行。他们都会提交,因为他们没有看到对方的条目。
实际上创建条目的缺点,然后删除它,如果它是无效的(我觉得有点麻烦)我想不出一种方法来解决这个问题。有任何想法吗?
编辑:根据要求我提供的样本数据:
table1的 +-------------+------------------+------+-----+----------------+ | Field | Type | Null | Key | Extra | +-------------+------------------+------+-----+----------------+ | id | int(10) unsigned | NO | PRI | auto_increment | | limit | int(10) unsigned | NO | MUL | | +-------------+------------------+------+-----+----------------+
表2 +-------------+------------------+------+-----+----------------+ | Field | Type | Null | Key | Extra | +-------------+------------------+------+-----+----------------+ | id | int(10) unsigned | NO | PRI | auto_increment | | foreign_id | int(10) unsigned | NO | MUL | | +-------------+------------------+------+-----+----------------+
和一些样本数据:
table1的 +----+----------+ | id | limit | +----+----------+ | 1 | 5 | +----+----------+
表2 +----+---------------+ | id | foreign_id | +----+---------------+ | 1 | 1 | +----+---------------+ | 2 | 1 | +----+---------------+ | 3 | 1 | +----+---------------+ | 4 | 1 | +----+---------------+
在这一点上,假设两个用户试图创建table2条目。第一个将被接受,第二个被拒绝。
第一种方法是,如果两个用户都经历了步骤1(计算旧条目),然后通过步骤2(插入新条目),则两个条目都将被创建。
第二种方法,如果它们都在同一时间运行,它们都将在它们自己之前计数4个槽并提交而不是其中的一个回滚。
“我需要根据外键创建多个条目。”请更详细地解释这一点。样本数据和期望的结果总是一个好主意。 – fancyPants