2014-12-13 19 views
7

DOP fornisce funzioni di avviare, commit e rollback delle transazioni:Funzioni di transazione DOP rispetto a istruzioni di transazione MySQL?

$dbh->beginTransaction(); 
$sth = $dbh->prepare(' 
    ... 
'); 
$sth->execute(); // in real code some values will be bound 
$dbh->commit(); 

C'è qualche motivo per utilizzare le funzioni DOP sopra semplicemente utilizzando le istruzioni di transazione in MySQL? Cioè:

$sth = $dbh->prepare(' 
    START TRANSACTION; 
    ... 
    COMMIT; 
'); 
$sth->execute(); // in real code some values will be bound 

UPDATE: Solo una nota a chiunque altro cercando in questo, dopo alcuni test in realtà ho trovato il secondo caso di cui sopra (usando START TRANSACTION e COMMIT in prepare()) si tradurrà in un'eccezione essere gettato. Pertanto, per utilizzare le transazioni con una dichiarazione preparata, è necessario che utilizzi le funzioni DOP mostrate nel primo caso.

risposta

10

Dal punto di vista della portabilità, è meglio utilizzare l'interfaccia fornita da PDO nel caso in cui si desideri lavorare con un DBMS diverso o portare un altro membro del team che è abituato a un altro DBMS.

Ad esempio, SQLite uses a slightly different syntax; se dovessi passare a un database SQLite da MySQL, dovresti modificare ogni stringa nel codice PHP che contiene la dichiarazione START TRANSACTION; perché non sarebbe più una sintassi valida per il tuo database. SQL Server 2014 è un altro esempio che non utilizza questa sintassi.

Ovviamente, you can also use BEGIN; in MySQL per avviare una transazione e che funzionerebbe correttamente in SQLite e SQL Server. Potresti semplicemente usarlo invece.

Spesso sarai in grado di trovare una sintassi che ti piace e che è ragionevolmente portatile, ma perché dedicare tempo ed energia a pensarci anche se non è necessario? Approfitta del fatto che ci sono a dozen PDO drivers disponibili per semplificarti la vita. Se ti interessa della coerenza, preferisci l'API sulla sintassi SQL specifica per l'implementazione.

2

La differenza tra la transazione PDO e mysql non è nulla. AD ECCEZIONE

È possibile ad esempio avviare la transazione, fare in modo che alcune query eseguano del codice php esegua più query in base al proprio codice e tali, e si potrebbe eseguire il rollback alla fine di tale codice semplicemente eseguire $PDO->rollback(); in modo molto più semplice rispetto alla creazione di 2 - 3 ulteriori querys invece di usare $pdo->beginTransaction();

Anche l'utilizzo di $pdo->rollback(); è di poche righe più brevi e, a mio parere, è anche più chiaro rispetto alla creazione di un'altra query e all'esecuzione.

+0

Quelle transazioni emulate sono talvolta utili, ma a volte è necessario prendere il risultato, ad es. ultimo ID inserimento da una query nella transazione. – Zaffy

Problemi correlati