как обрабатывать несколько вставок одновременно - PullRequest
3 голосов
/ 23 марта 2011

Мне нужно выполнить несколько запросов одновременно.Ниже вы можете увидеть пример.Как я могу быть уверен, что после того, как я выполню вставку в таблицу A и сохраню последний идентификатор вставки в переменной, это будет правильное значение, вставленное в другие таблицы, если в это же время произойдет другая вставка?Нужно ли блокировать все таблицы, выполнять запросы, а затем разблокировать таблицы?Я читал что-то о транзакциях.Они нужны мне?Спасибо за любой совет.

create table a (
id int not null auto_increment primary key,
name varchar(10)
) engine = innodb;

create table b (
id int not null auto_increment primary key,
id_a int
) engine innodb;

create table c (
id int not null auto_increment primary key,
id_a int)
engine innodb;

insert into a (name) values ('something');
set @last_id = last_insert_id();
insert into b (id_a) values (@last_id);
insert into c (id_a) values (@last_id);

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

В этой последовательности

insert into a (name) values ('something');
set @last_id = last_insert_id();
insert into b (id_a) values (@last_id);
insert into c (id_a) values (@last_id);

Переменная @last_id является глобальной, но уникальной для вашего конкретного сеанса.Поэтому, как только оно установлено, значение не изменится, если вы не измените его снова.

Что касается last_insert_id (), в частности manual состояний

Сгенерированный идентификатор поддерживается на сервере для каждого подключения.

Так что не имеет значения, что делают другие соединения.Вставки в b и c гарантированно будут использовать идентификатор, сгенерированный для a.

1 голос
/ 23 марта 2011

Если бы я делал это, я бы, вероятно, открыл transaction как указано http://dev.mysql.com/doc/refman/5.0/en/commit.html

Если бы вы использовали каркас, такой как CodeIgniter, у вас был бы доступ к уровню абстракции базы данных, который работал бы аналогичным образом, например, http://codeigniter.com/user_guide/database/transactions.html

1 голос
/ 23 марта 2011

В соответствии с документацией MySQL last_insert_id() применяется только к текущему сеансу.

Созданный идентификатор сохраняется на сервере для каждого подключения.Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом.На это значение не могут повлиять другие клиенты, даже если они генерируют собственные значения AUTO_INCREMENT.Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь об активности других клиентов и не нуждаясь в блокировках или транзакциях.

...