rollback – There is no active transaction

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ondrej256
Člen | 187
+
0
-

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)

David Grudl
Nette Core | 8235
+
0
-

Jak vypadá ta výjimka?

ondrej256
Člen | 187
+
0
-

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)
bazo
Člen | 620
+
0
-

nebude to bug v pdo? to iste sa mi stava aj s doctrine 2 na php5.6

ondrej256
Člen | 187
+
0
-

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
+
0
-

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
+
0
-

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

https://forum.nette.org/…transactions