Allen,

Op de bekende zoekmachine kom ik genoeg voorbeelden tegen van prepared statements i.c.m. transactions.
Maar toch werkt bij mij de rollback niet. Een exception op de 2e tabel, terwijl de 1e wel is toegevoegd.

Kan iemand mij uitleggen wat er fout gaat? Dit is de eerste keer dat ik transactions wil gebruiken.

Ingekort voorbeeld:

<?php
try
{
	$db->beginTransaction();

	$sql = "
	INSERT
		INTO " . TABLE_PREFIX . "profile
		(
			naam
		)
		VALUES
		(
			:naam
		)
	";
	
	$stmt = $db->prepare($sql);
	
	$stmt->bindParam(':naam', $_POST['gegevens']['naam'], PDO::PARAM_STR);

	$stmt->execute();
	
	$profile_id = $db->lastInsertId();
	
	$sql = "
	INSERT
		INTO " . TABLE_PREFIX . "application
		(
			profile_id
		)
		VALUES
		(
			:profile_id
		)
	";
	
	$stmt = $db->prepare($sql);
	
	$stmt->bindParam(':profile_id', $profile_id, PDO::PARAM_INT);

	$stmt->execute();
	
	$db->commit();
}
catch(PDOException $e)
{
	if(isset($db))
	{
		$db->rollBack();
	}
}
?>


Bvd
Welke storage engine gebruik je? Niet elke storage engine ondersteunt transactions (MyISAM, de standard, in elk geval niet).
Dat verander ik eigenlijk nooit, dus standaard MyISAM.
Dan kan ik lang blijven zoeken als het daarop niet werkt.

Welke raad je wel aan te gebruiken?

Ik heb de volgende keuzes

<select name="new_tbl_type">
    <option value="MRG_MYISAM" title="Collection of identical MyISAM tables">
        MRG_MYISAM
    </option>
    <option value="BLACKHOLE" title="/dev/null storage engine (anything you write to it disappears)">
        BLACKHOLE
    </option>
    <option value="CSV" title="CSV storage engine">
        CSV
    </option>
    <option value="MEMORY" title="Hash based, stored in memory, useful for temporary tables">
        MEMORY
    </option>
    <option value="ARCHIVE" title="Archive storage engine">
        ARCHIVE
    </option>
    <option value="MyISAM" title="Default engine as of MySQL 3.23 with great performance" selected="selected">
        MyISAM
    </option>
</select>
Ik kan me InnoDB wel herinneren, maar zie hem er nu inderdaad niet (meer) tussen staan.
Misschien eens contact opnemen met m'n hosting of hun wat voor me willen/kunnen doen.

Bedankt voor je reactie in ieder geval. Ik weet nu in ieder geval waar het probleem ligt.

Toevoeging op 23/04/2014 15:51:54:

Ik krijg als antwoord van de support om de 'MariaDB database (BETA)' te gebruiken die wel InnoDB ondersteund.
Wat vinden jullie van MariaDB en is het verschil met MySQL erg groot?
Geen ervaring mee, maar een snelle blik op de Wikipedia pagina ( http://en.wikipedia.org/wiki/MariaDB ) leert dat het wel goed zou moeten zitten. Ontwikkeld door hetzelfde team als dat MySQL heeft ontwikkeld. Ik kan alleen zo snel niet vinden welke php mogelijkheden er zijn, maar iets zegt me dat je gewoon PDO moet kunnen gebruiken.
Blijkbaar is het een kopie, maar vanuit daar verder ontwikkelt. Dus is het eigenlijk MySQL maar met extra functies.
Ik ga morgen verder kijken hoe ik kan overschakelen.

The goal for Maria-DB is to be a drop-in replacement for MySQL – with more features and better performance.

MariaDB is based on the corresponding version of MySQL, if one exists. For example, MariaDB 5.1.53 is based on MySQL 5.1.53, with some added bug fixes, additional storage engines, new features, and performance improvements. Versions of MariaDB that do not have an equivalently numbered version of MySQL (e.g., MariaDB 5.2.4) contain major new features the developers felt warranted a new version number. When comparing the two here, I’ll focus on the additional features of MariaDB.

bron
Ik vind het wel typisch dat een hosting adviseert om MariaDb te gaan gebruiken omdat de MySQL versie die zij draaien geen InnoDB engine heeft. Welke versie is dat?
Waar Ger nog aardig "typisch" schrijft, zou ik "verontrustend" invullen.
Ozzie, bedankt. Dat maakt in ieder geval duidelijk dat je om mariadb te gebruiken niks hoeft aan te passen. Dus heb er zeker wat aan.

Ger & Ward, ja bijzonder is t wel. Ik weet ook niet hoeveel werk het voor hun is om InnoDB op MySQL te installeren? Ze kunnen vast niet aan alle gebruikerswensen gehoor geven.

Ger, Welke versie MySQL? Waar kan ik dat vinden? In phpinfo() staat 'MySQL Client API version 5.5.35' en in phpmyadmin staat 'MySQL-client versie: 5.1.72'.

[edit]
Voor de MySQL is het versie 5.1.73
Voor MariaDB is de MySQL versie 5.5.36
[/edit]

Toevoeging op 23/04/2014 20:33:23:

Ik heb zojuist een database aangemaakt in MariaDB er hier de tabellen in geïnstalleerd.
Standaard staat deze engine wel op InnoDB en de rollback werkt! :)

Reageren