2013-06-13 19 views
5

Ho difficoltà a far funzionare le transazioni manuali come documentato in DBD :: Pg, o sto semplicemente fraintendendo la documentazione.Gestione manuale delle transazioni in DBD :: Pg

La mia comprensione è che se voglio gestire manualmente le transazioni, dovrei disattivare AutoCommit.

$dbh->{AutoCommit} = 0; 
$dbh->begin_work; 

Ma quando faccio questo, ottengo gli errori continui

DBD::Pg::db begin_work failed: Already in a transaction 

Per ottenere questo lavoro, ho bisogno di accendere AutoCommit prima.

$dbh->{AutoCommit} = 1; 
$dbh->begin_work; 

Ma quello non sembra essere d'accordo con alcuno della documentazione.

Sto semplicemente fraintendendolo?

+0

Sembra tutto piuttosto strano. Puoi mostrare un test case completo e dare le tue versioni DBI e DBD :: Pg? –

risposta

1

La mia comprensione è che se voglio gestire manualmente le transazioni, dovrei disattivare AutoCommit.

No, proprio il contrario. L'impostazione di AutoCommit a 0 avvia una transazione, quindi si desidera impostarla su 1. Per fare in modo che le modifiche vengano eseguite automaticamente è necessario che il database non utilizzi le transazioni, il che è esattamente ciò che si desidera.

+0

Sembra piuttosto non intuitivo. Attiva autocommit, quindi sono in grado di avviare una transazione manuale. –

+0

Certo che lo è, perché stai facendo qualcosa di sciocco. – ikegami

+2

Per essere onesti, ha senso solo una volta realizzato autocommit = 0 invia un BEGIN per te –

2

La mia comprensione è che se voglio gestire manualmente le transazioni, dovrei disattivare AutoCommit.

Corretto.

Tuttavia, DBD :: Pg avvia automaticamente le transazioni per voi. Non è possibile avviare le transazioni manualmente. L'opzione migliore è lasciare l'autocommit disattivato e quindi fare semplicemente:

$dbh->commit; 

quando si è pronti a eseguire il commit. Ciò commetterà sia la transazione esistente che inizierà una nuova transazione.

Ora se si imposta l'autocommit su on, quindi qualsiasi cosa che esiste al di fuori di una transazione diventa la propria transazione, una transazione per la dichiarazione . Se si desidera essere certi della gestione manuale delle transazioni, si desidera disattivarla.

Problemi correlati