Me enfrenté a un problema. Tengo una aplicación con Hibernate que carga datos de archivos XML en tablas en modo concurrente. Alguna parte de los datos podría ser la misma y podría insertarse desde hilos de differnet. Cada hilo funciona en su propia transacción de juego largo. Hay un problema cuando dos o más pisadas intentan comprometer la transacción. Por ejemplo, dos hilos insertaron registros en la tabla Ciudad que tiene una restricción en campo NOMBRE. Significa que ConstraintViolationException se produce en flush() o commit(). Quiero manejar automáticamente estas colisiones y desear que los nuevos objetos problemáticos sean reemplazados por objetos viejos ya insertados. es posible? Veo saveOrUpdate() y el control de versión optimista en Hibernate.Hibernate inserción simultánea
Respuesta
Supongo que usa uno de MVCC-based DBMS.
Si el nivel de aislamiento de transacción no es superior a READ COMMITTED, puede reducir la probabilidad de conflicto emitiendo una consulta para verificar la existencia de Cities con el mismo name
antes de insertar el nuevo.
Tenga en cuenta que saveOrUpdate()
no puede ayudar aquí, ya que name
no es una clave principal. También tenga en cuenta que no puede evitar conflictos en absoluto (al menos sin utilizar algunas funciones específicas de DBMS), ya que básicamente es un ejemplo de write skew anomaly, que no se puede evitar en DBMS basado en MVCC.
Además, si la atomicidad de la importación del archivo XML no es crítica, puede dividir las transacciones largas en varias más cortas, y simplemente reintentarlas en caso de una violación de restricciones.
Gracias, es una buena idea romper la transacción. Creo que verificar la existencia del objeto City no puede ayudar en un escenario concurrente. Siempre hay una posibilidad de tener una colisión. De acuerdo con saveOrUpdate() ya lo marcó. –
Disculpe, ¿quiere decir usar READ UNCOMMITTED y verificar existencia? Creo que puede ayudar. Al menos los registros sin compromiso se comparten entre las transacciones y no es tan costoso hacer la comprobación de la existencia en la sesión sin compromiso. –
En situaciones como esta, utilizamos la convención de un método 'insertOrUpdate()' con el siguiente flujo general. La transacción se confirma por el llamador del método 'insertOrUpdate()' a su regreso:
public MyHibernateObject insertOrUpdate(MyHibernateObject newObj, Session s) {
String name = newObj.getCityName();
MyHibernateObject existingObj = getByCityName(name, s);
if (existingObj == null) {
s.saveOrUpdate(newObj);
return newObj;
} else {
existing.copyImportantFields(newObj);
s.saveOrUpdate(existing);
return existing;
}
}
- 1. Inserción masiva de JPA/Hibernate (lote)
- 2. Hibernate/MySQL Problema de inserción masiva
- 3. Hibernate Embedded/de inserción no excepción nula
- 4. ¿Cómo puedo asegurarme de que lastSsertId() de PDO no es el de otra inserción simultánea?
- 5. Cómo está Hibernate decidiendo el orden de actualización/inserción/eliminación
- 6. Hibernate cascada de inserción no insertar clave externa
- 7. Hibernate - Personalizar inserción en la base de datos
- 8. ¿Cómo imitar el comportamiento de inserción utilizando Hibernate?
- 9. Semáforos y programación simultánea
- 10. Excepción simultánea Excepción
- 11. simultánea AVCaptureVideoDataOutput y AVCaptureMovieFileOutput
- 12. simultánea de acceso a archivos
- 13. Coleta de prioridad variable simultánea
- 14. .NET lenguaje para programación simultánea
- 15. Lista enlazada simultánea sin cerradura en Java
- 16. cuánto solicitud HTTP simultánea puede manejar erlang
- 17. alternativa SQLite con la escritura simultánea (Delphi)
- 18. ¿Cómo hacer la edición simultánea en vivo?
- 19. Uso de datos centrales simultánea y confiablemente
- 20. Patrones de diseño para la programación simultánea?
- 21. ¿Puede Hibernate automáticamente mayúscula una columna en lectura/inserción a través de la configuración?
- 22. La fusión de Hibernate de JPA realiza una inserción en lugar de la actualización
- 23. Hibernate Entrada duplicada '1' para la clave 'PRIMARY' en la primera inserción en la tabla
- 24. Configuración de la actualización e inserción de la propiedad en Hibernate
- 25. Inserción masiva O actualización con hibernación?
- 26. No se puede anidar una instrucción de inserción de inserción
- 27. STL rendimiento del mapa de inserción: [] vs. inserción
- 28. es SSIS inserción masiva lo mismo que una inserción masiva
- 29. Obteniendo el id de inserción con inserción PDO MySQL
- 30. escritura simultánea a la misma dirección de memoria
Hola, me alegraría si comparte su solución a ese problema. Parece que a continuación se encuentra la respuesta correcta; sin embargo, una breve explicación debería ser más conveniente. Muchas gracias. – Javatar