Могу ли я использовать значение базы данных сразу после его вставки? - PullRequest
1 голос
/ 30 июня 2010

Могу ли я вставить что-то в базу данных MySQL, используя PHP, а затем немедленно сделать вызов для доступа к этому, или вставка асинхронна (в этом случае существует вероятность того, что база данных не закончила вставку значения до того, как я запросил его)?

Ответы [ 4 ]

2 голосов
/ 30 июня 2010

Я думаю, что ОП спрашивает это:

<?
  $id = $db->insert(..);
  // in this case, $row will always have the data you just inserted!
  $row = $db->select(...where id=$id...)

?>

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

2 голосов
/ 30 июня 2010

Если значение вставлено в транзакцию, оно не будет доступно для любой другой транзакции, пока ваша исходная транзакция не будет зафиксирована.Кроме того, он должен быть доступен по крайней мере «очень скоро» после того, как вы его совершите.

2 голосов
/ 30 июня 2010

Обычно существует два способа использования MySQL (и большинства других баз данных SQL):

  1. Транзакционный.Вы запускаете транзакцию (неявно или с помощью чего-то вроде 'BEGIN'), запускаете команды, а затем либо явно фиксируете транзакцию, либо откатываете ее (если не выполнить никаких действий до отключения соединения с базой данных, произойдет автоматический откат).

  2. Автоматическая фиксация.Каждый оператор автоматически фиксируется в базе данных при его выдаче.

Режим по умолчанию может отличаться, но даже если вы находитесь в режиме автоматической фиксации, вы можете просто переключиться на транзакционный режим.путем выдачи BEGIN.

Если вы работаете транзакционно, любые изменения, которые вы вносите в базу данных, будут локальными для вашего соединения / экземпляра БД, пока вы не выполните фиксацию.Выполнение фиксации должно блокироваться до тех пор, пока транзакция не будет полностью зафиксирована, поэтому, как только она вернется без ошибок, вы можете предположить, что данные там есть.

Если вы работаете в режиме автоматической фиксации (а ваша библиотека базы данных нечто-то действительно странное), вы можете рассчитывать на то, что введенные вами данные будут доступны, как только вызов, который вставит данные, вернется.

Обратите внимание, что рекомендуется всегда работать транзакционно.Даже если вы выполняете только одно атомарное утверждение, хорошо иметь привычку правильно начинать и совершать транзакции.Это также избавляет вас от неприятностей, когда новая версия вашей библиотеки баз данных по умолчанию переключается в транзакционный режим, и внезапно все ваши однострочные операторы SQL никогда не фиксируются.:)

1 голос
/ 30 июня 2010

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

Что такоеконтекст, в котором вы задаете вопрос?

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