2010-05-18 100 views
10

Tengo una tabla de usuario y tengo 5 registros.Rollback no funciona en MySQL

Eliminé dos registros, luego ejecuté el comando de deshacer, se ejecutó con éxito.

Pero eso eliminó dos registros no recuperados.

El motor de la tabla de usuario es InnoDB.

+0

El título de tu pregunta es * muy * poderoso! Suena como el español para todos ustedes, chicos en MySQL, están dopando mientras codifican y todos ustedes usuarios finales dev han estado usando db dopado! * .. lol. ¡MySQL DB es un gran hombre! No se puede arrojar tal acusación :) –

Respuesta

8

Usted debe ser capaz de deshacer la transacción como el motor de la mesa es InnoDB. enter image description here

De todas formas aquí es la forma correcta de hacer las transacciones,

SET autocommit=0; 
START TRANSACTION; 
Your Query here. 
ROLLBACK; 

y asegúrese de que no está utilizando COMMIT después de la consulta que se necesita para deshacer. Consulte Table Engines y Transaction. Y cuando se crea una conexión DB, está en modo autocompromiso de forma predeterminada. Esto significa que cada declaración de SQL individual se trata como una transacción y se confirma automáticamente justo después de que se ejecuta. Por lo tanto, si necesita realizar transacciones usted mismo, debe desactivar el modo de confirmación automática al AUTOCOMMIT = 0. Consulte esto link para obtener más información.

+0

uso directamente iniciar transac y rollback. pero no uso SET autocommit = 0; . pero para mí la reversión de trasnaciones funcionó. Me gustaría saber el propósito de este SET autocommit = 0; – Bharanikumar

+1

@Bharanikumar: cuando se crea una conexión de base de datos, está en modo de confirmación automática de forma predeterminada. Esto significa que cada declaración de SQL individual se trata como una transacción y se confirma automáticamente justo después de que se ejecuta. Por lo tanto, si necesita realizar transacciones usted mismo, debe desactivar el modo de confirmación automática mediante 'establecer AUTOCOMMIT = 0'. Consulte http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commit.html –

+0

breve explicación gracias –

5
By default, MySQL starts the session 
for each new connection with 
autocommit enabled, 

También podemos establecer el modo de confirmación automática desactivar antes de ejecutar la consulta

SET autocommit=0; 

ref:

Link 1

Link 2

+0

no funciona ... para mí ... lo intenté por dev-mysql-support – Bharanikumar

2

Asegúrese de que ya lo hacen comando

start transaction; 

antes de la consulta de eliminación.

+0

no tengo idea de esto ... cómo hacer el comando iniciar transacción. .. – Bharanikumar

0

que tienen el mismo problema, pero se ha comprobado el apoyo innodb

Primero: Compruebe si el INNODB motor está disponible: con esto:

mysql> show engines; 

si INNODB está desactivada: a continuación

Segundo: vaya al archivo "mi.ini", en mi caso es en C: \ AppServ \ mysql en este archivo elimina el "#" de la línea

#default-storage-engine=INNODB -> default-storage-engine=INNODB 

y la línea skip-innodb complemento "#"

skip-innodb -> #skip-innodb 

en tercer lugar:.. guardar y reiniciar el servicio MySQL, y el problema se solucionó

2

no sé si estaban bloqueando las tablas, pero me encontré con el mismo problema en el que parecía que la reversión no estaba funcionando

Dentro de mi transacción que he llamado "LOCK TABLES ...", que

compromete implícitamente cualquier transacción activa antes de intentar bloquear las tablas

(http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)

acabé bloqueo fuera (antes) de la transacción, ya que eso fue lo primero que hice en la transacción de todos modos. Alternativamente, se puede hacer como los documentos sugieren:

SET autocommit=0; 
LOCK TABLES t1 WRITE, t2 READ, ...; 
... do something with tables t1 and t2 here ... 
COMMIT; 
UNLOCK TABLES; 
0

creo que hay una cosa importante mencionar: para volver a activar la confirmación automática después de la transacción se lleva a cabo.

SET autocommit = 0; 
START TRANSACTION; 
    INSERT INTO .. 
    UPDATE <table> .. 
COMMIT; 
SET autocommit = 1; 

De lo contrario cualquier cosa que hacer después de desactivar autocommit incluso sin la transacción será necesario que confirma de forma explícita.