Блокировка максимального значения в MySQL - PullRequest
1 голос
/ 11 августа 2011

Я использую следующий запрос на MySQL с использованием PHP

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

Структура таблицы CART:

CART (SrNo int(10));

Теперь я использую результат длявыполните некоторую обработку и вставьте максимальное значение в эту таблицу, увеличив его на единицу.Моя проблема в том, что если user1 получил максимальное значение SrNo и находится между обработкой.В течение этого времени пользователь user2 также запрашивает, чтобы сервер получил то же максимальное значение SrNo, что и пользователь user1, и начинает обработку.

Теперь, когда оба будут выполнены с обработкой + вставкой в ​​таблицу, у меня будет два дубликата в таблице CART.Как я могу предотвратить это?

Другими словами, я не хочу, чтобы никто другой получил максимальное значение SrNo до тех пор, пока один пользователь не закончит свою обработку.

Ответы [ 3 ]

1 голос
/ 11 августа 2011

НЕТ, тривиальная вещь с веб-приложением, которое создает новое соединение при каждом запросе. Вам нужно добавить в эту таблицу столбцы lockedBy и lockedTime и указать в них пользователя ID, который запрашивал блокировку, а также отметку времени, когда запрашивалась блокировка. Вам нужна временная метка, чтобы вы могли игнорировать блокировки, которые длиннее определенного времени.

0 голосов
/ 11 августа 2011

Разве вам не понравится функция AUTO_INCREMENT для PRIMARY KEY?

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

, затем просто вставьте новые строки, и они будут автоматически увеличивать новые значения. Это, вероятно, очень легко сделает трюк, который вы (возможно?) Пытаетесь сделать.

Но если вам нужно заблокировать maxmium, вы можете сделать это:

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

Помните: Вы должны использовать транзакцию для любой операции, которая не является одним единственным запросом!

0 голосов
/ 11 августа 2011

если вы установите SrNo в качестве первичного ключа в таблице, то второе время, когда вы попытаетесь добавить строку, приведет к сбою, а в случае неудачи вы можете запросить новый номер.

ALTER TABLE cart ADD PRIMARY KEY (SrNo);
...