1

我正在使用 PHP 在 MySQL 上使用以下查询

$sql = SELECT MAX(SrNo) FROM cart;
$result = mysql_query($sql);

表 CART 的结构是

CART (SrNo int(10));

现在我正在使用结果进行某种处理,并通过递增一个将最大值插入到该表中。我的问题是,如果 user1 获得了最大值SrNo并且在处理之间。在此期间,user2 还请求服务器获得与 user1 获得的相同的 SrNo 最大值并开始处理。

现在,当两者都完成了处理+插入到表中时,我将在表 CART 中有两个重复项。我怎样才能防止这种情况发生?

换句话说,我不希望其他人获得 until 的最大值,SrNo除非一个用户完成了它的处理。

4

3 回答 3

1

对于在每个请求上创建新连接的 Web 应用程序来说,这不是一件小事。您需要在该表中添加一个lockedBylockedTime列,并在其中放入一个ID请求锁的用户以及请求锁的时间戳。您需要时间戳,以便您可以忽略超过一定时间的锁。

于 2011-08-10T20:10:55.410 回答
0

如果你将 SrNo 设置为表上的主键,那么第二次你尝试添加的行将失败,如果失败,你可以请求一个新的数字。

ALTER TABLE cart ADD PRIMARY KEY (SrNo);
于 2011-08-10T20:26:01.353 回答
0

对 PRIMARY KEY 的 AUTO_INCREMENT 功能你不满意吗?

create table cart ( SrNo int(10) AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB;

然后只需简单地插入新行,它就会自动增加新值。这可能很容易做到你(也许?)试图做的伎俩。

但是如果你需要锁定最大值,你可以这样做:

start transaction;
select max(SrNo) from cart for update;
/* do some other stuff, insert the max value + 1 etc... */
commit;

请记住:您应该将事务用于不是 1 个单一查询的任何操作!

于 2011-08-10T21:26:30.307 回答