Created: 2024-09-08 dom 17:54
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 guardarollback
primary key
unique
foreign key
check
triggers
(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 tablascommit
rollback
Read commited
Serializable
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 mode
select <una consulta que devuelva algunas filas de una tabla>
for update
SA
bloquea la fila/tabla OA
SB
bloquea la fila/tabla OB
SA
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 esperandoSQL
v_$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 SESSION
spid
(system process identifier)spid
es del proceso intermedio entre el cliente (application code) y el servidor (system global area)