bloqueos en oracle 9i release 2

Ver?a
14 de Abril del 2005
Tengo el siguinete problema en oracle 9i release 2.

Se tiene la tabla "A" la cual tiene una clave primaria y la tabla "B" , tiene una clave foranea hacia la clave primaria de la tabla "A", se bloquea en forma exclusiva la tabla "B" con el usuario1, se quiere actualizar todas las columnas de la tabla "A" con el usuario2, y este usuario se queda bloqueado mientras, el usuario1 no de un commit y libere la tabla "B". la cual no interviene en la actualización de todos los campos de la tabla "A".

En la versión release 2 de oracle 9i, existe un problema al actualizar todas las columnas de una tabla, existe algún parche para solucionar esto?.


lola
14 de Abril del 2005
eso se llama dependencia referencial y no es un bug, es una medida de seguridad para garantizar la integridad y consistencia de los datos.............. haz el programa sabiendo como funciona oracle y no pretendas cambiar oracle para que funcione tu programa que, por cierto, sería mucho peor
saludos

Ver?a
14 de Abril del 2005
Hola,
Al parece no has ntendido el problema te lo pongo con un ejemplo.

--Se crea la tabla a
create table a (id number constraint nl_a_id not null,
codigo varchar2(50),
fecha_creacion date,
fecha_aprobacion date);

--Se crea la tabla b
create table b (ord_id number constraint nl_b_ordid not null,
cant number(17,4));

-- Se asigna la clave primaria a la tabla a
alter table a add (
constraint pk_a primary key (id));

-- Se asigna la calve foránea a la tabla B
alter table b add (
constraint fk_b_ord_id foreign key (ord_id)
references a (id));

-- Se genra datos para la tabla A
insert into a
(id,
codigo,
fecha_creacion,
fecha_aprobacion
)
values (1,
'aa',
to_date ('12/30/1899 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM'),
to_date ('12/30/1899 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM')
);
-- Se abre una sesion y se realiza el bloqueo en forma exclusiva a la tabla B (usuario1)
lock table b in exclusive mode nowait;

-- Se abre otra sesion y se realiza el update a la tabla A (usuario2)
update a
set id = 1,
codigo = 'bb',
fecha_creacion = '01042005',
fecha_aprobacion = '01042005'
where id = 1;

-- Al intentar hacer el update se queda bloqueado el usuario del update mientras no se desbloquee la tabla B, la cual no tiene nada que ver con la dependencia referencial.

Si se observa desde Enterprise Manager Console se tiene:

Usuario1 12 TM Exclusive None B
Usuario2 12 TM None Share B

Como vez se queda en cola el usuario2 hasta que el usuario1 no suelte la tabla b, la cual no tiene nada que ver con la A al realizarce una actualización de sus campos.

Una solución que se puede dar desde el form es que al bloque en sus propiedades se le asigne la propiedad Actualiza solo columnas cambiadas en Sí, pero mi pregunta era si habia como solucionar esto pero en la base de datos.

manuel
14 de Abril del 2005
todos hemos entendido tu problema aunque tu no entiendes como funciona oracle.... mi consejo es que quites la foreign key