Created: 2025-02-03 lun 18:10
| Atomicidad | Un conjunto de cambios se realiza en su totalidad, o no se realiza ninguno |
| Consistencia | Las reglas de los datos (constraints) se respetan |
| aIslamiento | Cada usuario puede trabajar considerando que es el único que utiliza la base de datos |
| Durabilidad | Una vez grabada una modificación, persistirá aunque ocurra algún fallo posterior |
commit: Los cambios se guardanrollback: Ningún cambio se guardarollbackprimary keyuniqueforeign keychecktriggers (scripts del gestor de base de datos)drop)commit que
| Lectura sucia | Dirty read | Un usuario lee datos aún no confirmados |
| Lectura no repetible | Repeatable read | Un usuario lee menos filas (o filas cambiadas) en select sucesivas dentro de la misma transaccción |
| Fila fantasma | Phanton read | Un usuario lee más filas en select sucesivas dentro de la misma transacción |
| Problema | Nivel de aislamiento |
|---|---|
Read Uncommited (Oracle no lo tiene) |
|
| Lectura sucia | |
Read commited (por defecto en Oracle) |
|
| Lectura no repetible | |
Repeatable read (Oracle no lo tiene) |
|
| Fila fantasma | |
Serializable |
create table ALUMNOS( DNI varchar(10), NOMBRE varchar(10));
insert into ALUMNOS values ('1','Pepe');
insert into ALUMNOS values ('2','Juan');
insert into ALUMNOS values ('3','María');
| Conexión 1 | Conexión 2 |
|---|---|
set transaction isolation level read committed |
set transaction isolation level read committed |
select * from alumnos |
select * from alumnos |
update alumnos set nombre='Pepe2' where dni=3 |
|
select * from alumnos |
|
| Aún no se ve el cambio, sería una lectura sucia | |
commit |
|
select * from alumnos |
|
| Ahora se ve el cambio, es una lectura no repetible | |
rollback |
| Conexión 1 | Conexión 2 |
|---|---|
set transaction isolation level read committed |
set transaction isolation level read committed |
select * from alumnos |
|
insert into ALUMNOS values('4','Susana') |
|
commit |
|
select * from alumnos |
|
La conexión 1 leerá más alumnos en la segunda select, una fila fantasma |
|
rollback |
set isolation level indica a la base de datos que bloquee filas, campos o tablascommitrollbackRead commitedSerializable| Conexión 1 | Conexión 2 |
|---|---|
set transaction isolation level serializable |
|
select * from alumnos |
|
update alumnos set nombre='Pepe2' where dni=3 |
|
select * from alumnos |
|
| No se ve el cambio, sería una lectura sucia | |
commit |
|
select * from alumnos |
|
| El cambio no se ve, sería lectura no repetible | |
rollback |
| Conexión 1 | Conexión 2 |
|---|---|
set transaction isolation level serializable |
|
insert into ALUMNOS values('5','Pepe') |
|
commit |
|
select * from alumnos |
|
| No se ve el cambio, sería lectura fila fantasma | |
rollback |
lock table TABLA in exclusive modeselect <una consulta que devuelva algunas filas de una tabla>
for update
SA bloquea la fila/tabla OASB bloquea la fila/tabla OBSA intenta acceder a OB. Se queda bloqueada, esperando su liberaciónSB intenta acceder a OA. Se queda bloqueada, esperando su liberaciónSA ni SB pueden liberar sus recursos, porque están esperandoSQLv_$session |
v_$process |
V_$SQLTEXT |
V_$LOCK |
V_$LOCKED_OBJECT |
V_$SESS_IO |
select
username,
osuser,
terminal
from
sys.v_$session
where
username is not null
order by
username,
osuser;
SELECT s.username, s.program, s.logon_time
FROM sys.v_$session s, sys.v_$process p, sys.v_$sess_io si
WHERE s.paddr = p.addr(+)
AND si.sid(+) = s.sid
AND s.type = 'USER';
select session_id "sid",SERIAL# "Serial",
substr(object_name,1,20) "Object",
substr(os_user_name,1,10) "Terminal",
substr(oracle_username,1,10) "Locker",
nvl(lockwait,'active') "Wait",
decode(locked_mode,
2, 'row share',
3, 'row exclusive',
4, 'share',
5, 'share row exclusive',
6, 'exclusive', 'unknown') "Lockmode",
OBJECT_TYPE "Type"
FROM
SYS.V_$LOCKED_OBJECT A,
SYS.ALL_OBJECTS B,
SYS.V_$SESSION c
WHERE
A.OBJECT_ID = B.OBJECT_ID AND
C.SID = A.SESSION_ID
ORDER BY 1 ASC, 5 Desc;
select s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
from v_$lock l1, v_$session s1, v_$lock l2, v_$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l1.id2 = l2.id2 ;
Fuente: http://www.oracle-ckpt.com/scripts-for-locks-and-blocking-sessions/
SQL bloqueada (de un SID)select s.sid, q.sql_text from v_$sqltext q, v_$session s
where q.address = s.sql_address
and s.sid = *ELSIDBLOQUEADO*
order by piece;
SQL bloqueadasselect s.sid, q.sql_text from v_$sqltext q, v_$session s
where q.address = s.sql_address
and s.sid in (
select s2.sid
from v_$lock l1, v_$session s1, v_$lock l2, v_$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2
)
order by piece;
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv_$session s
JOIN gv_$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
ALTER SYSTEM KILL SESSION 'sid,serial#';
KILL SESSIONspid (system process identifier)v$process.spid es del proceso intermedio entre el cliente (application code) y el servidor (system global area)v$sessoin.process es del proceso cliente, que está en la máquina cliente, no el el servidor