Foros del Web » Programando para Internet » PHP »

Transacciones atomicas

Estas en el tema de Transacciones atomicas en el foro de PHP en Foros del Web. hola compaz, necesito ayuda urgente. en un script de php tengo que hacer dos 'insert', pongamosle insert1 e insert2. el problema es que en cierto ...
  #1 (permalink)  
Antiguo 03/12/2008, 15:16
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Exclamación Transacciones atomicas

hola compaz,

necesito ayuda urgente.

en un script de php tengo que hacer dos 'insert', pongamosle insert1 e insert2.

el problema es que en cierto modo estan unidos, eso no importa. lo que importa es que quiero hacer que se ejecuten los dos inserts al tiempo, si falla uno que no se ejecute el otro. me explico (no se si me explico mucho):

$insert1="insert.....";
$insert2="insert.....";

cuadno lo vaya a ejecutar no haga esto:
$rs1=odbc_exec($conectar,$insert1);
$rs1=odbc_exec($conectar,$insert2);

por que si el insert1 falla se registra el insert2 y/o visceversa, me causaria problemas.

estuve averiguando y me dijeron que se llaman transacciones atomicas, q es hacer los insert sin que ninguno falle, y si alguno falle no se ejecute el otro, pero busco y no encuentro, me ayudan????
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #2 (permalink)  
Antiguo 03/12/2008, 15:21
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ATENCION::: Transacciones atomicas

Hola lobo_php,

Las transacciones las brinda tu RDBM, depende del RDBM que usas se implementan de diferente forma, y es precisamente eso si algo "falla" en toda tu logica haces un Rollback y con eso garantizas la consistencia de datos.

Saludos.
  #3 (permalink)  
Antiguo 03/12/2008, 15:26
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: ATENCION::: Transacciones atomicas

mi RDBM me imagino q es el gestor de base de datos, es DB2, no entiendo mucho de eso, eso es algo como el as400, algo asi. la uso como un odbc.

GatorV me puedes ayudar con eso? tienes algun ejemplo que me des?
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #4 (permalink)  
Antiguo 03/12/2008, 15:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ATENCION::: Transacciones atomicas

Pues si DB2, soporta transacciones puedes hacer algo asi:
Código php:
Ver original
  1. <?php
  2. $conn = odbc_connect($odbc,$user,$password)
  3.     or die($error);
  4.  
  5. odbc_autocommit($conn, FALSE);
  6.  
  7. odbc_exec($conn, $query1);
  8. odbc_exec($conn, $query2);
  9.  
  10. if (!odbc_error()) {
  11.       odbc_commit($conn);
  12. } else {
  13.       odbc_rollback($conn);
  14. }
  15. odbc_close($conn);

Saludos.
  #5 (permalink)  
Antiguo 03/12/2008, 15:43
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: ATENCION::: Transacciones atomicas

primero ejecuto ambos y luego hago lo del !odbc_error?
estas seguro GatorV?
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #6 (permalink)  
Antiguo 03/12/2008, 16:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ATENCION::: Transacciones atomicas

Lee el proceso de como es la transaccion, de hecho te recomiendo leas sobre transacciones, para luego implementarlas, en el foro de Bases de Datos me imagino te pueden recomendar lecturas al respecto.

Saludos.
  #7 (permalink)  
Antiguo 03/12/2008, 16:32
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: ATENCION::: Transacciones atomicas

ok una ultima pregunta si tengo eso mismo que tiene GatorV en su ejemplo pero luego de eso qiero hacer otro insert o consulta puedo poner otra ves el if(!odbc_error){...}
o con solo ese sirve para todas las consultas y/o inserts en la pagina no importando la posicion que ocupe?
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #8 (permalink)  
Antiguo 03/12/2008, 16:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ATENCION::: Transacciones atomicas

La idea es que tu hagas todas tus consultas, y llames a odbc_rollback() en caso de error, y odbc_commit() al final en caso de que todo este bien, las llamadas a odbc_exec() las puedes poner donde quieras mientras esten dentro del bloque de la transacción.

El odbc_error() es en caso de que exista un error pero bien tu puedes comprobarlo por ti mismo por ejemplo si ves que un dato es incorrecto o algo mandas llamar a odbc_rollback() explicitamente.

Saludos.
  #9 (permalink)  
Antiguo 04/12/2008, 06:50
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: ATENCION::: Transacciones atomicas

puedo hacer esto:

Código php:
Ver original
  1. <?php
  2. $conn = odbc_connect($odbc,$user,$password)
  3.     or die($error);
  4.  
  5. odbc_autocommit($conn, FALSE);
  6.  
  7. odbc_exec($conn, $query1);
  8.  
  9.  
  10. if (!odbc_error()) {
  11.       odbc_commit($conn);
  12.       odbc_exec($conn, $query2);
  13. } else {
  14.       odbc_rollback($conn);
  15. }
  16. odbc_close($conn);


es que no me quedo muy claro si luego de esos inserts puedo hacer consultas, por ejemplo yo quiero hacer esto:

Código php:
Ver original
  1. <?php
  2. $conn = odbc_connect($odbc,$user,$password)
  3.     or die($error);
  4.  
  5. odbc_autocommit($conn, FALSE);
  6.  
  7. odbc_exec($conn, $query1);
  8. odbc_exec($conn, $query2);
  9.  
  10. if (!odbc_error()) {
  11.       odbc_commit($conn);
  12. } else {
  13.       odbc_rollback($conn);
  14. }
  15. $consulta="select * from tabla";
  16. $rs=odbc_exec($conn,$consulta);
  17. odbc_close($conn);

al estar despues del if(!odbc_error) no se ejecuta o la puedo usar asi?
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #10 (permalink)  
Antiguo 04/12/2008, 09:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ATENCION::: Transacciones atomicas

Claro que lo puedes usar, tu puedes lanzar todas las consultas que quieras hasta que cierres la conexion con odbc_close.

Por otro lado si ya no vas a usar la transacción es mejor que la cierres llamando a odbc_autocommit y pasarlo como true.

Saludos.
  #11 (permalink)  
Antiguo 04/12/2008, 12:24
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: ATENCION::: Transacciones atomicas

ok pero al usar eso de las transacciones me aparece un error que yo se que es bastante confuso, el 7008. que dice que la tabla 'tabla' no es valido, en unos lados dicen que es por el juournal pero he descubierto que tambien sale cuando trato de haer update en una tabla padre, tengo un post de eso.
la verdad no se ese error que es lo que quiere.
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #12 (permalink)  
Antiguo 04/12/2008, 14:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ATENCION::: Transacciones atomicas

Hola lobo_php,

Lamentablemente eso ya sale fuera de lo que es PHP, ya que es un error directo de ODBC, te recomiendo pongas tu duda en el foro de Bases de Datos estoy seguro que alguien te podra apoyar.

Al parecer ODBC tiene un problema al usar AS/400 y transacciones pero como te comento es mejor que te digan claramente el error.

Saludos.
  #13 (permalink)  
Antiguo 05/12/2008, 07:17
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Transacciones atomicas

si, tengo un post de eso pero como que no saben lo suficiente de ese error. xD
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:15.