|
|
|
| При осуществлении записи в таблицу с помощью INSERT INTO, новой записи автоматически назначается идентификатор. Как получить идентификатор данной конретной строки сразу после того, как ее записали?
С тем, чтобы последующие записи, если они идут сплошным потоком, не создали ошибок? | |
|
|
|
|
|
|
|
для: Владимир55
(02.02.2009 в 18:49)
| | я правильно понимаю, что поиском мы пользоваться брезгуем? | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2009 в 18:53)
| | Нет, я видел Ваш пост за 2007 год, где Вы предлагали вызывать mysql_insert_id() сразу после INSERT INTO.
Но ведь это же операторы рнр, и, как уже на форуме писалось, они не гарантируют, что будут выполнены друг за другом, и между ними не вклинится иная запись. Я и сам с этим встретился при записи в файл, когда в статике всё работает хорошо, а в сети раз в неделю происходит сбой, ибо находятся пользователи, которые "лезут друг на друга".
База, как я полагал, от этих проблем свободна.
Не так? | |
|
|
|
|
|
|
|
для: Владимир55
(02.02.2009 в 19:12)
| | > Но ведь это же операторы рнр, и, как уже на форуме писалось, они не гарантируют
Кем писалось? Насколько я знаю всё должно быть нормально. | |
|
|
|
|
|
|
|
для: Владимир55
(02.02.2009 в 19:12)
| | > предлагали вызывать mysql_insert_id() сразу после INSERT INTO.
>Но ведь это же операторы рнр, и, как уже на форуме писалось, они не гарантируют,
они-то как раз и гарантируют.
В форуме много чего пишется... сами понимаете... и много кем. | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2009 в 19:17)
| | А по идее (при желании), можно сделать абсолютно надежно, если действовать в обратном порядке:
- создать предварительную служебную запись чтобы просто занять строку;
- получить идентификатор этой записи, отыскав ее по заранее заложенному служебному признаку (например, microtime);
- занести в эту строку ту информацию, которую там в действительности нужно хранить.
Так будет лучше? | |
|
|
|
|
|
|
|
для: Владимир55
(02.02.2009 в 19:35)
| | В том то и дело, что Вы не сможете задать такой признак руками, так чтоб он был уникален.
Потому как параллельно исполняющийся вызов того же скрипта тоже поставит такой же такой признак.
А гарантию дает либо mysql_insert_id либо SELECT LAST_INSERT_ID() | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2009 в 19:41)
| | "Вы не сможете задать такой признак руками, так чтоб он был уникален"
Вероятно, сделать такой признак вполне возможно. Например, путем задания времени с точностью до 1 микросекунды
list($usec, $sec) = explode(" ", microtime());
$metka = ($sec + $usec)*1000000 ;
|
Вероятность, что и другой скрипт будет обращаться в течение этой же микросекунды, исчезающе мала.
Но меня заинтересовало другое: может быть, LAST_INSERT_ID работает в контексте текущего соединения? | |
|
|
|
|
|
|
|
для: Владимир55
(02.02.2009 в 20:16)
| | >Но меня заинтересовало другое: может быть, LAST_INSERT_ID работает в контексте текущего соединения?
Так и есть. Иначе обе эти функции не имели бы смысла. | |
|
|
|