Diskuze: po chybě v PDO transakci nejde nic upravovat

PHP PHP po chybě v PDO transakci nejde nic upravovat American English version English version

Aktivity (1)
Avatar
radian1
Člen
Avatar
radian1:10. srpna 19:15

Ahoj, mám dva soubory skript1.php a skript2.php
V jednom sem záměrně udělal chybu v transakci:

skript1.php

try  {
        $db->beginTransaction();
        $db->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY');

        // čtení z db

        // zápis v db

        $db->commit();

} catch (PDOException $error) {
        $db->rollback();
}

skript2.php

try  {
        $db->beginTransaction();
        $db->exec('SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY');

        // čtení z db

        // zápis v db

        $db->commit();

} catch (PDOException $error) {
        $db->rollback();
}

když spustím ten první je to OK, ale jakmile spustím ten druhý, už nemůžu dělat nic s databází, nemůžu ani spustit transakci ve skript1.php, nemůžu ani nic přímo upravit v mysql přes phpmyadmin.

Zkusil jsem: všechno možné

Chci docílit: Jak to jde opravit? A proč nejde s databáí nic dělat když v tom catch spouštím rollback?

Plus bych měl ještě pár dotazů ohledně transakcí.

  1. Co je výchozí nastavení? (tím myslím level izolace)
  2. Když provádím transakci je vždy zaručeno že bude vždy spuštěna jen jedna?
 
Odpovědět 10. srpna 19:15
Avatar
radian1
Člen
Avatar
radian1:10. srpna 19:19

ještě doplním chybu:
#1792 - Cannot execute statement in a READ ONLY transaction

 
Nahoru Odpovědět 10. srpna 19:19
Avatar
Odpovídá na radian1
Petr Štechmüller:10. srpna 20:07

If the transaction access mode is set to READ ONLY, changes to tables are prohibited. This may enable storage engines to make performance improvements that are possible when writes are not permitted.

V dokumentaci jasné píšou, že pokud nastavis READ ONLY, tak nemůžeš nic zapisovat.

Nahoru Odpovědět 10. srpna 20:07
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
radian1
Člen
Avatar
Odpovídá na Petr Štechmüller
radian1:10. srpna 20:44

no to já vím, ale co když napíšu tohle:

$db->beginTransaction();
        $db->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY');
        // čtení z db
        // zápis v db

což způsobí chybu a potom spustím tohle:

$db->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE');
// zápis

když tam mám SET SESSION ... READ WRITE jakto že to i přes to ukázalo chybu?

 
Nahoru Odpovědět 10. srpna 20:44
Avatar
radian1
Člen
Avatar
radian1:10. srpna 20:45

k čemu je teda ten SESSION dobrej?

 
Nahoru Odpovědět 10. srpna 20:45
Avatar
radian1
Člen
Avatar
radian1:10. srpna 20:48

ok tak ten GLOBAL je na celou dobu spuštění mysql, to už vím... ale pořád nechápu k čemu je ten session + otázky 1) a 2)

 
Nahoru Odpovědět 10. srpna 20:48
Avatar
radian1
Člen
Avatar
radian1:11. srpna 10:00
$db->exec('SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ ONLY');

A teď se session

$db->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE');

Proč nemůžu zapisovat do databáze když tam mám session reader write?

 
Nahoru Odpovědět 11. srpna 10:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.