rollback – There is no active transaction
- ondrej256
- Člen | 187
Zdravím,
narazil jsem v nette database na problém s hláškou:
There is no active transaction
Kod vypadá asi takto:
try {
$this->database->beginTransaction();
// nejaky insert do db
// dalsi insert
$this->database->commit();
} catch (PDOException $e) {
// nekdy se stane že se odchytne PDO Exception
$this->database->rollback(); // a pak to spadne tady na rollbacku, který vyhodí exception: There is no active transaction
}
Netušíte jak je možné že se něco takového stane?
Transakci spouštím třeba 100× po sobě
Editoval ondrej256 (31. 1. 2015 13:58)
- ondrej256
- Člen | 187
dump
PDOException #5d50
message protected => "There is no active transaction" (30)
string private => "exception 'PDOException' with message 'There is no active transaction' in C:\wamp\www\system\vendor\nette\database\src\Database\ResultSet.php:64
Stack ... " (1044)
code protected => 0
file protected => "C:\wamp\www\system\vendor\nette\database\src\Database\ResultSet.php" (67)
line protected => 64
trace private => array (6)
0 => array (6)
file => "C:\wamp\www\system\vendor\nette\database\src\Database\ResultSet.php" (67)
line => 64
function => "commit" (6)
class => "PDO" (3)
type => "->" (2)
args => array ()
1 => array (6)
file => "C:\wamp\www\system\vendor\nette\database\src\Database\Context.php" (65)
line => 102
function => "__construct" (11)
class => "Nette\Database\ResultSet" (24)
type => "->" (2)
args => array (3) [ ... ]
2 => array (6)
file => "C:\wamp\www\system\vendor\nette\database\src\Database\Context.php" (65)
line => 51
function => "queryArgs" (9)
class => "Nette\Database\Context" (22)
type => "->" (2)
args => array (2) [ ... ]
3 => array (6)
file => "C:\wamp\www\system\app\DispatchModule\imports\myImport.php" (95)
line => 228
function => "commit" (6)
class => "Nette\Database\Context" (22)
type => "->" (2)
args => array ()
4 => array (6)
file => "C:\wamp\www\system\app\DispatchModule\imports\myImport.php" (95)
line => 99
function => "importStatus" (12)
class => "App\DispatchModule\imports\myImport" (72)
type => "->" (2)
args => array (1) [ ... ]
5 => array (6)
file => "C:\wamp\www\system\bin\import.php" (57)
line => 22
function => "importStatuses" (14)
class => "App\DispatchModule\imports\myImport" (72)
type => "->" (2)
args => array ()
previous private => NULL
errorInfo => NULL
queryString => "::commit" (8)
- ondrej256
- Člen | 187
Nejspíš ano. Ale nevím jak ten problém vyřešit.
cela transakce proběhne úspěšně, ale v momentě kdy se dá commit tak se vyhodí výjimka
PDO Exception: There is no active transaction
a PDO Exception ošetřuju rollbackem, který následně vyhodí
PDO Exception: There is no active transaction
- ondrej256
- Člen | 187
Tak už jsme to vyřešili.
jedna z funkcí pro insert byla transakce (čehož jsem si nevšiml). Takže když se tato transakce zavolala tak to spadlo hned na beginTransaction (protože nemůže začít transakce, když už jedna běží), v catch se to ošetřilo rollbackem, což ukončilo moji transakci, pak se pokračovalo dál v kódu první transakce, kde se spustil commit, jenže rollback ze zanořené transakce již ukončil vnější transakci a proto commit nemůže být vykonán protože žádná transakce již neběží a tak to spadne do catch, kde se spustí rollback, jenže žádná transakce neběží a tak to opět spadně :-)
Editoval ondrej256 (1. 2. 2015 14:56)
- mcmatak
- Člen | 504
jak jste vyřešili vložené transakce? řešil bych to přetížením Connection, ale nedaří se mi ani za nic nahradit v nette Connection třídu