0

我有一个名为“picks”的表,当用户登录并开始选择时,它最初会在该用户的“picks”表中插入 64 行(将用户 ID 作为列)。这些行是使用 php 中的循环插入的,因此使用 PDO 准备语句有 64 个插入。每个用户只需执行一次。我需要这些行对于该用户是连续的。如果其他几个用户在同一时间做同样的事情怎么办?是否有可能不会连续插入行?我需要使用表锁吗?我以前从未使用过它们。MySql 版本:5.0.92-rs-log MyISAM 谢谢

4

2 回答 2

0

首先,应该有更好的方法来解决这个问题,而不是依赖于单个用户的连续 ID。

实际上,存在并发问题的可能性。在其他 DBMS 中,比如 Oracle,你有序列而不是 auto_increment,这更适合这种类型的事情。你可以用一个只有一行的辅助表来模拟这个。在这种情况下,您的 ID(或其他)字段不会设置为 auto_increment,并且您将有一个名为sequence(例如)的表,您将在其中保存最后一个 ID。然后,在插入 64 条新记录之前,您将查询该表以获取最后一个 ID,然后对其进行更新。

像这样(不要关注PHP函数,只是为了使代码易于理解):

// Get the last ID
$last_id = query('SELECT last_id FROM sequence LIMIT 1');

// Store the last ID in your code and then update the new value
$new_id = $last_id + 64;
query('UPDATE sequence SET last_id = :new_id', array('new_id' => $new_id));

// Make sure your DB class is set on auto_commit or commit the transaction here

// Insert your new records
for ($i = ++$last_id; $i < $new_id; $i++) {
    query('INSERT INTO picks (id, user_id) VALUES (:id, :user_id)', array('id' => $i, 'user_id' => $user_id));
}
于 2012-03-11T03:04:57.457 回答
0

对于实际上不需要它们的问题,我不会使用表锁。没有行应该是连续的。也许您是根据自动增量 ID 订购它们?如果是这种情况,它们可能不是连续的,但它们将是有序的。此外,如果您需要这些行的特定顺序,您始终可以添加另一列来设置实际顺序。

无论如何,请尝试扩展您的问题以获得更合适的帮助。

于 2012-03-11T02:52:26.833 回答