2009-09-11 8 views
8

Mam zapytanie, które może być wykonywane przez kilku użytkowników kolejno. Boję się, że jeśli uruchomię komendę db_last_insert_id, niektórzy użytkownicy mogą nie otrzymać ostatniego identyfikatora wstawiania ze względu na współbieżność. Ale zgodnie z: http://api.drupal.org/api/function/db_last_insert_id/6, to sates:Ostatnia wstawka SQL w Drupal. Czy to naprawdę jest bezpieczne dla wątków?

Zwraca ostatni identyfikator insert. Ta funkcja jest bezpieczna dla wątków.

Moje pytanie brzmi, w jaki sposób jest bezpieczny ten wątek? Kod jest tylko:

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

Nie widzę nic na temat blokowania stołów czy nic?

Odpowiedz

19

MySQL (jak zdają się wskazywać, ze znacznikami na swoje pytanie) funkcja db_last_insert_id() jest zdefiniowana w ten sposób:

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

w database.mysql-common.inc


I LAST_INSERT_ID() zależy od połączenie (cytowanie, podkreślenie moje):

Generowany identyfikator to utrzymywany na serwerze na podstawie na połączenie. Oznacza to, że wartość zwracana przez funkcję do danego klienta jest pierwszą wartością o wartości AUTO_INCREMENT wygenerowaną dla najnowszej instrukcji wpływającej na kolumnę AUTO_INCREMENT tego klienta. Na tę wartość nie mają wpływu inne klienty , nawet jeśli same generują wartości o wartości AUTO_INCREMENT. Takie zachowanie sprawia, że ​​każdy klient można odzyskać swój identyfikator bez troski o aktywności innych klientów, bez konieczności zamków lub transakcjami.

Tak, powiedziałbym, że to jest całkiem OK dla MySQL ;-)


Definicja Twój pisał jest rzeczywiście jeden używany dla PostgreSQL:

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

W database.pgsql.inc


Od pgsql manual on sequences(cytowanie, nacisk mi ne):

currval

zwracają wartość ostatnio uzyskane przez nextval dla tej sekwencji w bieżącej sesji.(Błąd jest zgłaszane jeśli nextval nigdy nie było nazwie dla tej sekwencji w tej sesji .) Zauważ, że ponieważ jest to powrocie wartość session-local, to daje odpowiedź przewidywalne czy nie inne sesje Wykonaliśmy Nextval od bieżącej sesji zrobił.

Zgaduję więc, że to całkiem OK, dla PostGreSQL.

+1

Dziękuję. Chciałbym dać ci dziesięć UPS. – coderama

+2

Nie ma za co :-) huhu ^^ będziesz musiał zadać 10 innych pytań, na które znam odpowiedź :-D –

Powiązane problemy