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.
Je hebt de functie:
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...


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: [php]pdo.intransaction[/php]
en om nu nog een wrapper voor rond de db klasse te schrijven is het wat laat.

Dependecy injection ;)
Que? :D Voorbeeldje?
<?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);
}
}
?>
Gewoon een willekeurige controller.

Wanneer je nu wat toe wil voegen aan PDO doe je gewoon zo:
<?php
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:
<?php
class Database extends PDO
{
private $in_transaction = false;

public startTransaction()
{
$this->in_transaction = true;
return $this->beginTransaction();
}
public inTransaction()
{
return $this->in_transaction;
}

// en ook zo voor commit en rollback
}
?>

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.
<?php

class Database extends PDO
{
public function beginTransaction()
{
$this->in_transaction = true;

return parent::beginTransaction();
}
}
?>
Super:) Zo een klasse is er dan wel snel tussen gezet:)

Reageren