IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: po chybě v PDO transakci nejde nic upravovat

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
radian1
Tvůrce
Avatar
radian1:10.8.2018 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.8.2018 19:15
Avatar
radian1
Tvůrce
Avatar
radian1:10.8.2018 19:19

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

 
Nahoru Odpovědět
10.8.2018 19:19
Avatar
Odpovídá na radian1
Petr Štechmüller:10.8.2018 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.8.2018 20:07
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
radian1
Tvůrce
Avatar
Odpovídá na Petr Štechmüller
radian1:10.8.2018 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.8.2018 20:44
Avatar
radian1
Tvůrce
Avatar
radian1:10.8.2018 20:45

k čemu je teda ten SESSION dobrej?

 
Nahoru Odpovědět
10.8.2018 20:45
Avatar
radian1
Tvůrce
Avatar
radian1:10.8.2018 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.8.2018 20:48
Avatar
radian1
Tvůrce
Avatar
radian1:11.8.2018 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.8.2018 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.