Tengo un par de instancias de una aplicación J2EE ejecutándose en un único clúster de WebLogic.¿Puedo hacer una MERGE atómica en Oracle?
En algún momento, estas aplicaciones hacen un MERGE para insertar o actualizar un registro en la base de datos de Oracle de fondo. El MERGE comprueba si hay una fila con una clave primaria especificada o no. Si está allí, actualiza. Si no, inserte.
Supongamos ahora que dos instancias de aplicación desean insertar o actualizar una fila con la clave principal = 100. Supongamos que la fila no existe. Durante la etapa de "comprobación" de fusión, ambos ven que las filas no están allí, por lo que ambos intentan insertar. Luego recibo una violación de restricción clave única.
Mi pregunta es esta: ¿Hay una MERGE atómica en Oracle? Estoy buscando algo que tenga un efecto similar al INSERT ... FOR UPDATE
en PL/SQL, excepto que solo puedo ejecutar SQL desde mis aplicaciones.
EDIT: No estaba claro. ESTOY usando la instrucción MERGE mientras este error aún ocurre. La cuestión es que solo la parte "modificadora" es atómica, no la combinación completa.
La combinación es atómica. Funciona o falla como una unidad de trabajo completa. Lo que está viendo es el resultado de la implementación de Oracle de la consistencia multiversion. ¿Parece que estás buscando algo para seralizar las fusiones múltiples? Puede intentar usar las transacciones seralizables de Oracle, pero eso probablemente solo cambie el error de la restricción de clave única a no poder serializar el error de transacción. –
Mi base de datos/vocabulario de múltiples hilos podría estar equivocado. Mi comprensión es que el "trabajo o falla como una unidad de trabajo completa" se llama transaccional. Por Atomic, me refiero a que no puede producirse una fusión mientras se procesa otra combinación. Acerca de la serialización de fusiones, tendré que leer sobre eso. Gracias. – Russell
@Russell, la atomicidad es solo una propiedad de una transacción. Y significa tener éxito o fracasar como una unidad. Para ver exapmle, consulte: http://en.wikipedia.org/wiki/ACID y http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/transact.htm#sthref1298. –