PDO inTransaction (MySQL)
Hoi allen,
Is er een manier om te weten of er een transaction op een bepaald database-object open staat als je MySQL gebruikt i.s.m. PDO? Ik gebruik InnoDB, dus transactions zijn ondersteund.
Is er een manier om te weten of er een transaction op een bepaald database-object open staat als je MySQL gebruikt i.s.m. PDO? Ik gebruik InnoDB, dus transactions zijn ondersteund.
Gewijzigd op 17/01/2011 10:20:35 door Jens V
Je hebt de functie:
isInTransaction(), maar ik weet niet of je die precies bedoelt.
isInTransaction(), maar ik weet niet of je die precies bedoelt.
Nog niet opgevallen dat ik daarnaar verwijs? ;) inTransaction: "Note that currently only the PostgreSQL driver implements this method."
Jens V op 17/01/2011 10:15:47:
Nog niet opgevallen dat ik daarnaar verwijs? ;) inTransaction: "Note that currently only the PostgreSQL driver implements this method."
Nee, dat is niet echt duidelijke verwijzing (btw, je kunt gewoon php links maken met de php tag).
Volgens mij ondersteund mysql dit niet echt (het is mysql he) dus misschien zelf wat maken, of overstappen op postgresql?
PostgreSQL heb ik al mee gewerkt, maar het spijtige daarin is dat maar weinig hosts het hebben... Ik kom het probleem nu pas tegen (in de catch heb ik een $db->rollBack(); staan want ik gebruik 1 grote try-catch block voor alle queries.), en om nu nog een wrapper voor rond de db klasse te schrijven is het wat laat.
Ik zou het idd wel kunnen oplossen door in die wrapper-klasse zelf een bool bij te houden die aangeeft of er een transaction open staat...
Ik dacht dat vanwege de exacte naam van die functie in de titel :) En van die php-links, ik wist niet of dat ook met die pdo-links gaat. -> testje: pdo.intransaction
Ik zou het idd wel kunnen oplossen door in die wrapper-klasse zelf een bool bij te houden die aangeeft of er een transaction open staat...
Karl Karl op 17/01/2011 10:23:55:
Nee, dat is niet echt duidelijke verwijzing (btw, je kunt gewoon php links maken met de php tag).
Ik dacht dat vanwege de exacte naam van die functie in de titel :) En van die php-links, ik wist niet of dat ook met die pdo-links gaat. -> testje: pdo.intransaction
Gewijzigd op 17/01/2011 10:29:48 door Jens V
Quote:
en om nu nog een wrapper voor rond de db klasse te schrijven is het wat laat.
Dependecy injection ;)
Que? :D Voorbeeldje?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class IndexController extends Controller
{
protected $db;
// het 'injecteren' van de 'dependency', de DB verbinding in dit geval
public function setDb(PDO $db)
{
$this->db = $db;
}
public function indexAction()
{
$items = $this->db->query('QUERY')->fetchAll();
return $this->view->render('index', $items);
}
}
?>
class IndexController extends Controller
{
protected $db;
// het 'injecteren' van de 'dependency', de DB verbinding in dit geval
public function setDb(PDO $db)
{
$this->db = $db;
}
public function indexAction()
{
$items = $this->db->query('QUERY')->fetchAll();
return $this->view->render('index', $items);
}
}
?>
Gewoon een willekeurige controller.
Wanneer je nu wat toe wil voegen aan PDO doe je gewoon zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class Database extends PDO
{
// Wat extras
}
$controller = new Controller;
//eerst
$controller->setDb(new PDO);
//nu
$controller->setDb(new Database);
?>
class Database extends PDO
{
// Wat extras
}
$controller = new Controller;
//eerst
$controller->setDb(new PDO);
//nu
$controller->setDb(new Database);
?>
Dus wat ik eigenlijk nodig heb, die 'wrapper'-klasse, is niet meer dan dit:
Is er een manier dat ik die startTransaction kan beginTransaction noemen? Dus effectief die functie 'overschrijven', maar binnen in toch nog de originele aanroepen?
Code (php)
Is er een manier dat ik die startTransaction kan beginTransaction noemen? Dus effectief die functie 'overschrijven', maar binnen in toch nog de originele aanroepen?
Jep, met parent.
Super:) Zo een klasse is er dan wel snel tussen gezet:)
Maar hoe controleer je nu of hij klaar is met de transaction, want dat is volgens mij het belangrijkste, anders zit je na 1 keer na het beginnen van een transaction altijd vast in die transactie.
Correct me if i'm wrong
Correct me if i'm wrong
In die commit en rollBack gewoon $this->in_transaction terug op false zetten?
Ik denk niet dat je mag zeggen dat hij "uit" de transaction is zodra je commit uitvoert.
Dit is namelijk een status vanuit je DB, en hetgeen wat die transaction doet is eigenlijk een que opbouwen in je database, om die vervolgens uit te voeren, (als ik het goed heb).
Maar ik weet de exacte werking van RollBack niet,maar dat moet je dan wel goed onderzoeken voordat je simpelweg die veronderstelling aanneemt
Dit is namelijk een status vanuit je DB, en hetgeen wat die transaction doet is eigenlijk een que opbouwen in je database, om die vervolgens uit te voeren, (als ik het goed heb).
Maar ik weet de exacte werking van RollBack niet,maar dat moet je dan wel goed onderzoeken voordat je simpelweg die veronderstelling aanneemt
Zit misschien wel iets in, ja. En als ik nu de commit uitvoer en wacht op het resultaat (true of false) en dat resultaat dan aan de in_transaction geeft? Ik denk niet dat het dan nog mis kan zijn hoor?




