2013-06-13 36 views
5

Mam trudności z ręcznym wykonaniem transakcji, co udokumentowano w DBD :: Pg, lub po prostu nie rozumiem wspomnianej dokumentacji.Ręczne zarządzanie transakcjami w DBD :: Pg

Rozumiem, że jeśli chcę ręcznie zarządzać transakcjami, powinienem wyłączyć automatyczne zatwierdzanie.

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

Ale kiedy to zrobić, mam ciągłe błędy

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

Aby to dostać się do pracy, muszę włączyć AUTOCOMMIT pierwszy.

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

Ale to nie wydaje się zgadzać z żadną dokumentacją.

Po prostu nie rozumiem tego?

+0

To wszystko wydaje się dość dziwne. Czy możesz pokazać kompletny przypadek testowy i podać wersje DBI i DBD :: Pg? –

Odpowiedz

1

Rozumiem, że jeśli chcę ręcznie zarządzać transakcjami, powinienem wyłączyć automatyczne zatwierdzanie.

Nie, wręcz przeciwnie. Ustawienie AutoCommit na 0 rozpoczyna transakcję, więc chcesz ustawić ją na 1. Automatyczne zatwierdzanie zmian polega na tym, że baza danych nie używa transakcji, co jest dokładnie tym, czego potrzebujesz.

+0

Wydaje się raczej nieintuicyjne. Włącz autocawit, więc jestem w stanie rozpocząć transakcję ręczną. –

+0

Oczywiście, że tak, ponieważ robisz coś głupiego. – ikegami

+2

Aby być sprawiedliwym, ma to sens tylko wtedy, gdy zrealizujesz autocommit = 0 wysyła BEGIN dla ciebie –

2

Rozumiem, że jeśli chcę ręcznie zarządzać transakcjami, powinienem wyłączyć automatyczne zatwierdzanie.

Prawidłowo.

Jednak DBD :: Pg automatycznie rozpocznie transakcje za Ciebie. Nie można ręcznie rozpocząć transakcji. Najlepszym wyjściem jest wyłączenie autocommit, a następnie:

$dbh->commit; 

kiedy jesteś gotowy do zatwierdzenia. To spowoduje zatwierdzenie istniejącej transakcji i rozpoczęcie nowej transakcji.

Teraz, jeśli ustawienie autocommit jest włączone, wówczas wszystko, co istnieje poza transakcją, staje się jego własną transakcją, jedna transakcja na każde oświadczenie . Jeśli chcesz mieć pewność, że chcesz ręcznie zarządzać transakcjami, chcesz je wyłączyć.