SQL последняя вставка в Drupal. Это действительно потокобезопасный? - PullRequest
8 голосов
/ 11 сентября 2009

У меня есть запрос, который может выполняться несколькими пользователями последовательно. Я боюсь, что при запуске команды db_last_insert_id некоторые пользователи могут не получить последний идентификатор вставки из-за параллелизма Но в соответствии с: http://api.drupal.org/api/function/db_last_insert_id/6, оно насыщается:

Возвращает последний идентификатор вставки. Эта функция является поточно-ориентированной.

Мой вопрос: насколько безопасна эта тема? Код только:

<?php
  function db_last_insert_id($table, $field) {
   return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
  }
?> 

Я не вижу ничего о блокировке таблиц или ничего?

1 Ответ

19 голосов
/ 11 сентября 2009

Используя MySQL (как вы, вероятно, указываете с помощью тегов вашего вопроса) , функция db_last_insert_id() определяется следующим образом:

function db_last_insert_id($table, $field) {
  return db_result(db_query('SELECT LAST_INSERT_ID()'));
}

в database.mysql-common.inc


И LAST_INSERT_ID() зависит от соединения (цитирование, выделено мое) :

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

Итак, я бы сказал, что это вполне нормально для MySQL; -)


На самом деле, ваше опубликованное определение используется для PostGreSQL:

function db_last_insert_id($table, $field) {
  return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
}

В database.pgsql.inc


Из pgsql руководства по последовательностям (цитирование; выделено мое) :

currval

Вернуть значение в последний раз полученный nextval для этой последовательности в текущем сеансе . (Ошибка сообщается, если nextval никогда не был призвал к этой последовательности в этом сессия.) Обратите внимание, потому что это возвращая локальное значение сеанса, это дает предсказуемый ответ или не другие сессии выполнили nextval, поскольку текущий сеанс сделал .

Итак, я полагаю, это тоже нормально, для PostGreSQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...