Jump to content
Sign in to follow this  
caanmasu

[MySQL] Un error muy grave

Recommended Posts

Hola

 

Hoy les voy a explicar un error grave que se comete al crear tablas en MySQL. Después de leer esto me lo van a agradecer.

 

¿Habías tenido un error de una tabla corrupta y tenías que ir a /var/db/mysql/nombre_db y borrar el archivo .idb?

¿Piensas que fue casualidad que hubiera ocurrido eso y que no volverá a suceder?

La respuesta es no.

 

Hay dos motores de almacenamiento en las bases de datos. Son InnoDB y MyISAM.

InnoDB se especializa en realizar transacciones en la db. Es decir, que el motor debe garantizar que dos usuarios no accedan al mismo tiempo a la misma tabla.
Las transacciones se usan para que la operación se haga completa, es decir, si la operación llegara a quedar a medias, que se cancele. Esto sucede en los bancos. ¿Se imaginan que intenten sacar dinero en el banco, ocurra un error en el servidor y ustedes le habían dado al botón de sacar el dinero y se les descontó pero nunca salió el dinero porque el servidor no alcanzó a ejecutar esa parte? bueno, es eso.

Lo que hace InnoDB en el caso de que dos usuarios entren simultáneamente a la misma tabla, la bloquea.

El tema es más largo sobre InnoDB pero no es el tema central de este post.

 

MyISAM es el motor de almacenamiento común. Se utiliza para realizar las operaciones normales de la base de datos, que son SELECT, UPDATE, DELETE e INSERT.

 

¿Cuál es el error?

Al crear la tabla la hacemos con el asistente de Navicat y se le asignará por defecto el motor de InnoDB.

Si vas a revisar en tu base de datos seguramente tienes alguna tabla con motor InnoDB o todas.

Hasta ahí no hay problema.

El problema es el siguiente: atentos...

Si de alguna manera realizas una consulta donde dos o más usuarios entran al mismo tiempo a la tabla, se va a bloquear. Creo que se eliminará de Navicat. Esta parte no la sé muy bien. Vi que se puede recuperar pero aquí en este post no se va a hablar de recuperar tablas bloqueadas ni cómo desbloquearlas.

 

¿Por qué tu tabla player.player puede tener motor InnoDB y no se te ha bloqueado?

Si llegaras a hacer por ejemplo una quest de una consulta lo entenderás.

when login begin
	mysql_direct_query("UPDATE...)
end

Si haces esto, es probable que en algún momento la tabla se va a bloquear porque dos usuarios o más van a llegar a esa consulta al mismo tiempo.

 

La solución es cambiar el motor a MyISAM en todas las tablas que vayan con InnoDB.

¿Cómo se sabe si tiene InnoDB? selecciona la tabla y a la derecha aparecen las características de tu tabla.

Luego ejecuta la siguiente consulta:

ALTER TABLE nombre_tabla ENGINE = MyISAM;

Cuando vayas a crear una tabla no olvides poner al final ENGINE = MyISAM;

 

Saludos para todos.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...