en la pagina anterior dan un ejemplo que se entiende muy fácil
Código PHP:
/*
Este ejemplo se ha probado con MySql 4.0.16 tanto para linux como para windows
Deberéis crear una base de datos llamada "bd_transac"
En esta base de datos cread una tabla con el código
CREATE TABLE `cuentas` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`titular` VARCHAR(100) NOT NULL,
`cantidad_dinero` DECIMAL NOT NULL
);
Cambiad el tipo de la tabla a "INNO DB"
A continuación insertáis dos registros
INSERT INTO cuentas VALUES (1, 'Fco Javier Montesinos', '12000000');
INSERT INTO cuentas VALUES (2, 'María E. Crespo', '200000');
Por último ejecutáis el código en algún servidor apache que tenga instalados los módulos
de php (Yo lo he probado con la versión 4.1.2. sobre Apache 1.3.26 en Debian 3.0 r1 y
funciona perfectamente.
OJO con las mayúsculas en el MYSQL, sobre todo con los nombres de las tablas
*/
class objTransaccion_cuenta{
var $erNum = -1; // Número interno de error.
var $erStr = ""; // Descripción del error
var $conx; //Conexión con la Base de Datos
var $id;
var $cantidadDinero;
// Constructor de clase
// En el constructor se crea la conexión para todo el objeto
function objTransaccion_cuenta() {
// Se conecta con vuestro servidor, con vuestro usuario, y vuestra contraseña
$this->conx = mysql_connect("192.168.1.1", "root", "pwd");
mysql_select_db ("bd_transac", $this->conx);
}
function realizarTransaccionToCuenta($prmIdCuentaDestino){
$this->erNum = -1;
// Se inicia la transacción
mysql_query("BEGIN", $this->conx);
$txtSql = "update cuentas set cantidad_dinero = cantidad_dinero + " . $this->cantidadDinero . " where id = " . $prmIdCuentaDestino;
@mysql_query($txtSql, $this->conx);
if(mysql_errno($this->conx) != 0){
$this->erNum = 1;
$this->erStr = "No se ha podido ingresar el dinero en la cuenta de destino. Error php: " . mysql_error($this->conx);
}
// Si no se produjo error continuamos
if($this->erNum == -1){
$txtSql = "update cuentas set cantidad_dinero = cantidad_dinero - " . $this->cantidadDinero . " where id = " . $this->id;
@mysql_query($txtSql, $this->conx);
if(mysql_errno($this->conx) != 0){
$this->erNum = 2;
$this->erStr = "No se ha podido retirar el dinero en la cuenta de origen. Error php: " . mysql_error($this->conx);
}
}
// Si hubo algún error se realiza rollback sobre la transacción
// En caso contrario se finaliza la transacción con commit para aplicar los cambios
if($this->erNum != -1) mysql_query("ROLLBACK", $this->conx);
else mysql_query("COMMIT", $this->conx);
}
}
// Finaliza la clase
// Aplicación práctica del objeto.
$oC = new objTransaccion_cuenta();
$oC->id = 1;
$oC->cantidadDinero = 12340;
$oC->realizarTransaccionToCuenta(2);
if($oC->erNum != -1){
print "Se ha producido un error. " . $oC->erStr;
}
else{
print "La transacción se ha realizado correctamente";
}
unset($oC);