За последние 24 часа нас посетили 18913 программистов и 1636 роботов. Сейчас ищут 872 программиста ...

lastInsertId() внутри транзакции

Тема в разделе "PHP и базы данных", создана пользователем ellik, 5 ноя 2015.

  1. ellik

    ellik Новичок

    С нами с:
    14 сен 2015
    Сообщения:
    5
    Симпатии:
    0
    Используя lastInsertId() внутри транзакции, можно быть уверенным в том, что ID не возьмется с другой транзакции в глобальном смысле?

    Код (PHP):
    1.     $db->beginTransaction();
    2.         /*****/
    3.         $sql = "INSERT INTO products (name, price) VALUES (:name, :price)";
    4.         $sth = $db->prepare($sql);
    5.         $sth->execute(
    6.           array(
    7.             ':name'=>$product['main']['name'],
    8.             ':price'=>$product['main']['price'],
    9.           )
    10.         );
    11.         // Получаем id последней вставленной записи
    12.         $idProduct = $db->lastInsertId();
    13.  
    14.         /*****/
    15.         foreach ($product['attributes'] as $attribute) {
    16.           $sql = "INSERT INTO productAttribute (idProduct, nameAttribute) VALUES (:idProduct, :nameAttribute)";
    17.           $sth = $db->prepare($sql);
    18.           $sth->execute(
    19.             array(
    20.               ':idProduct'=>(int)$idProduct,
    21.               ':nameAttribute'=>$attribute['attribute'],
    22.             )
    23.           );
    24.         } 
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. ellik

    ellik Новичок

    С нами с:
    14 сен 2015
    Сообщения:
    5
    Симпатии:
    0
    Наткнулся в топике на тему, где говориться о том, что если единовременно из двух скриптов, которые одновременно произведут запись в таблицу, то может быть взят неверный ID
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    у субд свой механизм контроля целостности идентификаторов который работает вне зависимости от того есть транзакция или нет.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Если из этого метода брать, то будет хорошо. Если сделать запрос и селектом попытаться получить максимальный или какой там, то можно получить конечно соседский.