Temat: Transakcje i PDO

Witam mam mały problem z transakcjami.

Przykładowy kod

$dbh = new PDO($dsn, $DBUserName, $DBUserPass, $charset);

echo $dbh->beginTransaction();

$sth = $dbh->exec("DROP TABLE users_names");
$sth = $dbh->exec("UPDATE users SET pass = '12345'");

echo $dbh->rollBack();

zwracają true, true i polecenie się wykonuje. Żadnego errora, żadnego wyjątku nie wyrzuca. Tak jakby wszystko było ok. Niestety na bazie nie widać rezultatów, tabela usunięta i rollback nie zadziałał. Tabele są typu InnoDB

Gdy wywołuję polecenie w mysql> show processlist; okazuje sie, że jest proces uśpiony który właśnie wywołałem. Podobnie jest w przypadku użycia polecenia commit.

Przykładowy kod:

$dbh = new PDO($dsn, $DBUserName, $DBUserPass, $charset);

echo $dbh->beginTransaction();
$prepared = $dbh->prepare($query);
$prepared->execute();

echo $dbh->commit();

to samo tylko nie widać insertów na polach na których miało być wykonane query. Show processlist; proces uśpiony.

Najciekawsze jest to, że jeśli zamienię miejscami execute i commit to widać rezultaty

echo $dbh->beginTransaction();
$prepared = $dbh->prepare($query);

echo $dbh->commit();
$prepared->execute();

Tylko nie wiem czy wtedy transakcje faktycznie działają. Na php.net najpierw jest beginTransaction->prepared->execute->commit

Będe wdzięczny za sugestieTen post został edytowany przez Autora dnia 30.08.13 o godzinie 10:54
Jarosław Grzelak

Jarosław Grzelak Software Engineer,
StepStone Services
Sp. z o.o.

Temat: Transakcje i PDO

Transakcje w MySQL nie są typu ACID.

Rollback nie zadziała dla:

CREATE / ALTER / DROP DATABASE
CREATE /ALTER / DROP / RENAME / TRUNCATE TABLE
CREATE / DROP INDEX
CREATE / DROP EVENT
CREATE / DROP FUNCTION
CREATE / DROP PROCEDURE

Polecam PostgreSQL tam takich kwiatków nie ma ;)

Temat: Transakcje i PDO

Ale inserty powinny przejść.

Przekopiowałem całe query i wykonałem je bezpośrednio na bazie w stylu

START TRANSACTION;

MOJE QUERY;

ROLLBACK;

i działa. Jak przepuszcze przez PDO w PHP to nic się nie dzieje. PDO pozostawia uśpiony process na bazie tak jakby niechciał go zcommitować

Temat: Transakcje i PDO

Rozwiązałem problem

PDO nie obsługuje mulitquery dlatego się wszystko wywalało.

Kod typu:
$query = '

INSERT INTO ....... ,
INSERT INTO ....... ,
INSERT INTO FROM tabela WHERE id=(SELECT id FROM tabela WHERE)

';

$dbh = new PDO($dsn, $DBUserName, $DBUserPass, $charset);

$dbh->beginTransaction();
$prepared = $dbh->prepare($query);
$prepared->execute();

$dbh->commit();

nie zadziała.

Błąd logiczny. Najgorszy typ błedów do wykrycia.

Następna dyskusja:

Problem z PDO i ORDER BY




Wyślij zaproszenie do