database - soporta - optimizar consultas mysql explain
¿Transacciones para acceso DB de solo lectura? (3)
En primer lugar, esto suena como una optimización prematura. Como Steven señaló, las bases de datos más sensatas te pondrán en una transacción de todos modos, y lo único que están haciendo es llamar a commit después de cada declaración. Entonces, desde esa perspectiva, el compromiso automático puede ser menos eficaz ya que cada enunciado debe comenzar una nueva transacción. O tal vez no. Solo el benchmarking lo dirá y apuesto a que no hace lamer la diferencia en su aplicación.
Una razón por la que desea usar siempre una transacción es la consistencia de la protección. Si empiezas a jugar manualmente declarando una transacción solo cuando "necesitas", entonces te olvidarás en un momento crítico. O ese conjunto de operaciones supuestamente de solo lectura de repente no lo es, ya sea porque un programador posterior no se dio cuenta de que se suponía que era o porque su código llama a una función que tiene una escritura oculta. Por ejemplo, configuro mis clientes de bases de datos de línea de comandos para que no se confirmen automáticamente. Esto significa que puedo presionar con el dedo una consulta de eliminación y seguir retrocediendo.
Está el nivel de aislamiento, como se señaló. Esto le permite hacer varias lecturas sin preocuparse si algún otro proceso ha escrito en sus datos entre ellos haciendo que sus lecturas sean efectivamente atómicas. Esto te ahorrará muchas horas depurando una condición de carrera.
Y, finalmente, a menudo puede configurar una transacción para que sea de solo lectura. Esto verifica su suposición y saldrá el error si algo intenta escribir.
Aquí hay un buen artículo resumiendo todo. Los detalles son específicos de Oracle, pero los conceptos son genéricos.
Parece haber opiniones muy diferentes sobre el uso de transacciones para leer desde una base de datos.
Cita del artículo de DeveloperWorks Estrategias de transacción: descripción general de modelos y estrategias :
¿Por qué necesitarías una transacción si solo estás leyendo datos? La respuesta es que no. Iniciar una transacción para realizar una operación de solo lectura se suma a la sobrecarga del subproceso de procesamiento y puede provocar bloqueos de lectura compartidos en la base de datos (dependiendo del tipo de base de datos que esté utilizando y el nivel de aislamiento configurado).
Como opinión contraria, existe la siguiente cita de la documentación de Hibernate Acceso a datos no transaccionales y el modo autocompromiso
Nuestra recomendación es no utilizar el modo de confirmación automática en una aplicación, y aplicar transacciones de solo lectura cuando haya un beneficio obvio de rendimiento o cuando los cambios en el código futuro sean altamente improbables. Siempre prefiera las transacciones ACID regulares para agrupar sus operaciones de acceso a datos, independientemente de si lee o escribe datos.
También hay un debate similar en la lista de correo de EclipseLink here .
Entonces, ¿dónde radica la verdad? ¿Las transacciones para leer las mejores prácticas son o no? Si ambas son soluciones viables, ¿cuáles son los criterios para usar las transacciones?
Por lo que puedo ver, solo hace una diferencia si el nivel de aislamiento es más alto que ''read committed''. ¿Es esto correcto?
¿Cuáles son las experiencias y recomendaciones?
Se requieren transacciones para operaciones de solo lectura si desea establecer un tiempo de espera específico para consultas que no sean el tiempo de espera predeterminado, o si desea cambiar el nivel de aislamiento.
Además, cada base de datos, que desconoce las excepciones, iniciará internamente una transacción para cada consulta. En general, se considera que no se realiza una reversión de transacciones cuando esa reversión no es necesaria.
Los DBA pueden estar monitoreando la actividad de reversión, y cualquier comportamiento de reversión por defecto los molestará en ese caso.
Entonces, las transacciones se usan de todos modos, ya sea que las inicie o no. Si no los necesita, no los inicie, pero nunca realice una reversión en las operaciones de solo lectura.
Steven Devijver proporcionó algunas buenas razones para iniciar transacciones, incluso si las operaciones solo leen la base de datos:
- Establecer tiempos de espera o modos de bloqueo
- Establecer nivel de aislamiento
El SQL estándar requiere que incluso una consulta deba iniciar una nueva transacción si no hay ninguna transacción actualmente en progreso. Hay DBMS donde eso no es lo que sucede, por ejemplo, aquellos con un modo de confirmación automática (la instrucción inicia una transacción y la compromete inmediatamente después de que la declaración finalice). Otros DBMS realizan sentencias atómicas (confirmación automática efectiva) de forma predeterminada, pero inician una transacción explícita con una instrucción como ''COMENZAR TRABAJO'', cancelando el compromiso automático hasta el próximo COMMIT o ROLLBACK (IBM Informix Dynamic Server es uno de esos, cuando la base de datos no es MODE ANSI).
No estoy seguro sobre el consejo de nunca retroceder. No hace ninguna diferencia en la transacción de solo lectura, y en la medida en que molesta a tus DBA, entonces es mejor evitar ROLLBACK. Pero si su programa finaliza sin realizar un COMMIT, el DBMS debería hacer un ROLLBACK en su transacción incompleta, sin duda si modificó la base de datos y (por simplicidad) incluso si solo seleccionó datos.
En general, si desea cambiar el comportamiento predeterminado de una serie de operaciones, use una transacción, incluso si la transacción es de solo lectura. Si está satisfecho con el comportamiento predeterminado, entonces no es crucial usar una transacción. Si su código debe ser portátil entre DBMS, es mejor asumir que necesitará una transacción.