Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a...

66
Aislamiento Bloqueo

Transcript of Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a...

Page 1: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

AislamientoBloqueo

Page 2: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Necesidad de aislamiento

• En ambientes multiusuario, las transacciones acceden a los datos simultáneamente

• Datos que no estén aislados pueden estar errados

Page 3: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Bloqueo (locking)

• Mecanismo automático que aisla los datos para prevenir conflictos de los datos que se están modificando

Page 4: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Estructura interna de una tabla

Page 5: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Alcance de los candados

• El alcance de un candado determina cuántos datos se aislan• Tres alcances

Page 6: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Tipos de candados

• El tipo de candado determina la extensión del aislamiento de datos de otras transacciones

• Tres tipos de candados– Shared– Exclusive– Update

Page 7: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Candados Shared• Usado por sentencias que leen datos (selects)

• Otros procesos pueden leer los datos (coloca candado shared), pero ningún proceso puede cambiar los datos (coloca candado exclusive)

Page 8: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Candados exclusive

• Usado por sentencias que cambian datos (inserts, updates, deletes)

• Ningún otro proceso puede leer los datos (coloca candado shared) o cambiar los datos (coloca candado exclusive sobre la página)

Page 9: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Candados shared y exclusive

Nota: Se intenta involucrar dos tablas: un select para publishers y un delete para authors

Nota: Se usa la opción holdlock, la cual asegura que los candados shared no se liberan hasta cuando concluya la transacción.

• El instructor tipea:begin transelect * from pubs2..publishersholdlock

delete from pubs2..authors

• Espera ver los datos de publishers:select * from pubs2..publishers

Page 10: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Candados update• Usado por operaciones que pueden o no cambiar los datos

(updates, deletes)• Cuando el proceso primero escanea los datos, le aplica un

candado update. Otros procesos pueden colocar candados shared, pero ningún proceso puede colocar candados exclusive o update

Page 11: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Resúmen de tipos de candados

*Updates y deletes usan candados exclusive solamente para encontrar los datos que necesitan modificar

Statements

That Impose This Lock

If Data Already Has an S Lock

If Data Already Has an X Lock

If Data Already Has a U Lock

Scopes for Which This Lock Exists

Shared (S)

select Place another S lock

Wait for lock to be released

Place another S lock

Row, page, table

Exclusive (X)

insert, update*, delete*

Wait for lock to be released

Wait for lock to be released

Wait for lock to be released

Row, page, table

Update (U)

update, delete Place the U lock

Wait for lock to be released

Wait for lock to be released

Page

Page 12: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Deadlock

Page 13: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Resolución del deadlock

Page 14: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Esquema de bloqueo

• Esquema de bloqueo es un atributo de la tabla que determina qué datos asociados con la tabla están bloqueados

Page 15: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

bloqueo “allpages”• Se pueden bloquear las páginas de índices• El servidor usa candados de tabla y candados de página,

pero no candados de fila

Page 16: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Bloqueo “datapages”• Las páginas de índices nunca se bloquean• El servidor usa candados de tabla y candados de página, pero

no candados de fila

Page 17: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Bloqueo “datarows”• Las páginas de índices nunca se bloquean• El servidor usa candados de tabla, candados de página y

candados de fila

Page 18: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Comparación de esquemas de bloqueo

Can Index Pages be Locked?

What Kinds of Locks Are Used?

Available in Releases Prior to ASE 11.9?

Allpages locking scheme

Yes Table and page

Yes

Datapages locking scheme

No Table and page

No

Datarows locking scheme

No Table, page, and row

No

Page 19: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Fijar el esquema bloqueo• Sintaxis simplificada:

create table table_name (column_name datatype [ NULL | NOT NULL | IDENTITY ] ,...column_name datatype [ NULL | NOT NULL | IDENTITY ] )[ lock { allpages | datapages | datarows } ]

• Ejemplo:create table publishers (pub_id char(4) NOT NULL,pub_name varchar(40) NULL,city varchar(20) NULL,state char(2) NULL)lock datarows

• Si no se especifica un esquema de bloqueo, la tabla usa el esquema default de bloqueo

Page 20: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Cambiar el esquema de bloqueo

• Sintaxis simplificada:alter table table_name

lock { allpages | datapages | datarows }

• Ejemplo:alter table publisherslock datapages

Page 21: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo

• Ver el default del esquema de bloqueo actual:sp_configure "lock scheme"

• Crear una tabla con el esquema default de bloqueo:create table def_scheme (a int)

• Crear una tabla con un esquema de bloqueo especifico:create table dpl_scheme (a int) lock datapages

• Ver el esquema de bloqueo ambas tablas:sp_help def_schemeexec sp_help dpl_scheme

Page 22: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo

• Cambiar el esquema de bloqueo de la primera tabla:alter table def_scheme lock datarows

• Ver el esquema de bloqueo ambas tablas:sp_help def_schemeexec sp_help dpl_scheme

• Borrar los objetos de base de datos creados:drop table dpl_schemedrop table def_scheme

Page 23: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Leer datos no aislados

• Hay tres tipos de consultas o “reads”, que pueden retornar datos que son inadecuados para limitar el aislamiento de datos

• Las características de cómo se hacen estos “reads” son propios de cada DBMS

• Hay tres tipo de “reads”:– Dirty reads– Nonrepeatable reads– Phantom reads

Page 24: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Lectura sucia

• La transacción 1 modifica datos• La transacción 2 lee los datos modificados antes de que la

modificación haya terminado– Esta transacción lee datos “uncommitted” o “dirty”

Page 25: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Lectura no repetible

• La transacción 1 lee datos• La transacción 2 modifica esos datos antes de que la primera

transacción haya terminado– La primera lectura es ahora “nonrepeatable”

Page 26: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Lectura fantasma

• La transacción 1 lee un conjunto de filas que cumplen una condición

• La transacción 2 modifica los datos de algunas columnas que no cumplían esa condición y ahora la cumplen, o al contrario– Las filas que aparecen y desaparecen se denominan “phantoms”

Page 27: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Nivel de aislamiento

• Un nivel de aislamiento es un conjunto de candados que permiten o no una combinación particular de los tres tipos de lectura: sucia, no repetible o con fantasmas

• ANSI define cuatro niveles de aislamiento, cada uno más restrictivo que el anterior Dirty Reads Nonrepeatable

Reads Phantom Reads

Level 0 Allowed Allowed Allowed

Level 1 Prevented Allowed Allowed

Level 2 Prevented Prevented Allowed

Level 3 Prevented Prevented Prevented

Page 28: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Nivel 1 de aislamiento

• Nivel 1 - Comportamiento de select:– Se fijan candados Shared hasta que el select termine la

lectura de una fila o página– select espera a que se liberen los candados exclusive

Dirty reads prevented Nonrepeatable reads allowed Phantom reads allowed

Page 29: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Nivel 2 de aislamiento

• Nivel 2 - Comportamiento de select:– Se fijan candados Shared hasta que termine la transacción

• Este comportamiento es diferente al del nivel 1– select espera a que se liberen los candados exclusive

• Comportamiento discreto de nivel 2 requiere bloqueo “row-level”– Tables APL y tables DPL no tienen bloqueo “row-level”– Si una consulta con nivel de aislamiento 2 lee una tabla APL o DPL, se

forza comportamiento de aislamiento nivel 3

Dirty reads preventedNonrepeatable reads preventedPhantom reads allowed

Page 30: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Nivel 3 de aislamiento

• Nivel 3 – El nivel más restrictivo:

• Nivel 3 - Comportamiento de select:– Se fijan candados shared hasta que termine la transacción

• Este comportamiento es diferente al del nivel 1– select espera a que se liberen los candados exclusive

Dirty reads prevented Nonrepeatable reads prevented Phantom reads prevented

Page 31: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Nivel 0 de aislamiento

• Nivel 0 – El nivel menos restrictivo:

• Nivel 0 - Comportamiento de select:– Se fijan candados Shared hastaque select termine la

lectura de una fila o página– select ignora los candados exclusive

• Este comportamiento es diferente al del nivel 1

Dirty reads allowed Nonrepeatable reads allowed Phantom reads allowed

Page 32: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Fijar nivel de aislamiento

• Sintaxis para aislamiento a nivel de sesión:set transaction isolation level {

0 | read uncommitted |1 | read committed |2 | repeatable read |3 | serializable }

• Sintaxis para aislamiento a nivel de sentencia:select ...

at isolation {0 | read uncommitted |1 | read committed | 2 | read repeatable | 3 | serializable }

Page 33: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

holdlock y noholdlock• holdlock forza nivel de ailamiento 3, sin importar el nivel de

aislamiento actual– Para select se fijan candados shared hasta que termine la

transacción• noholdlock forza nivel de ailamiento 1, sin importar el nivel de

aislamiento actual– Para select se liberan los candados shared cuando se ha leido una

fila o página• Sintaxis simplificada:

select column_listfrom table_list [ holdlock | noholdlock ]

• Ejemplo:select titlefrom titles holdlockwhere pub_id = "0877"

Page 34: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.
Page 35: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Cursor

• Un cursor es un mecanismo que sirve para procesar fila por fila los resultados de una consulta

Page 36: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Beneficios de los cursores

• Se pueden procesar los datos fila por fila– SQL es un lenguaje orientado a conjuntos– El procesamiento se hace normalmente sobre las filas

que cumplan con una condición dada– Los cursors permiten el procesamiento fila por fila

• Se pueden modificar los datos fila por fila• Se puede sortear la brecha existente entre la

orientación a conjuntos de las bases de datos relacionales y la orientación a filas de muchos lenguajes de programación

Page 37: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ciclo de vida de un cursor

1. Declarar el cursor2. Abrir el cursor3. Tomar cada fila4. Cerrar el cursor5. Desasignar el cursor

Page 38: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Paso 1: Declarar el cursor

• Cuando se declara un cursor:– Se especifica una consulta– Se especifica un modo para el cursor

• De solo lectura• Para actualización

Page 39: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Sintaxis para declarar un cursor

• Sintaxis simplificada:declare cursor_name cursor

for select_statement[ for { read only | update [ of column_name_list ] } ]

• Ejemplo:declare biz_book cursor

for select title, title_id from titleswhere type = "business"

for read onlygo

Page 40: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Paso 2: Abrir el cursor

• Cuando se abre el cursor– El servidor crea el conjunto resultado– El apuntador está señalando antes de la primera fila del

conjunto respuesta

Page 41: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Sintaxis para la apertura de un cursor

• Sintaxis:open cursor_name

• Ejemplo:declare biz_book cursor

for select title, title_id from titleswhere type = "business"

for read onlygodeclare @title char(80), @title_id char(6)open biz_bookfetch biz_book into @title, @title_idwhile @@sqlstatus = 0

begin-- process @title and @title_idfetch biz_book into @title, @title_id

endclose biz_bookdeallocate cursor biz_book

Page 42: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Paso 3: Tomar cada fila

• Cuando se ejecuta un fetch:– El cursor señala a la siguiente fila válida– Retorna la siguiente fila válida

Page 43: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Sintaxis de un fetch

• Sintaxis:fetch cursor_name [ into fetch_target_list ]

• Ejemplo:declare biz_book cursor

for select title, title_id from titleswhere type = "business"

for read onlygodeclare @title char(80), @title_id char(6)open biz_bookfetch biz_book into @title, @title_idwhile @@sqlstatus = 0

begin-- process @title and @title_id

fetch biz_book into @title, @title_idend

close biz_bookdeallocate cursor biz_book

Page 44: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Pasos 4 y 5: Cerrar y desasignar el Cursor

• Cuando se cierra un cursor:– Termina el procesamiento de la consulta hecha

• Cuando se desasigna el cursor:– Se liberan todos los recursos de memoria asignados al

cursor

Page 45: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Cerrar y desasignar un Cursor

• Sintaxis:close cursor_namedeallocate cursor cursor_name

• Ejemplo:declare biz_book cursor

for select title, title_id from titleswhere type = "business"

for read onlygodeclare @title char(80), @title_id char(6)open biz_bookfetch biz_book into @title, @title_idwhile @@sqlstatus = 0

begin-- process @title and @title_idfetch biz_book into @title, @title_id

endclose biz_bookdeallocate cursor biz_book

Page 46: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Variables para el manejo de cursores

• Se tiene una variable que retorna el número total de filas procesadas (@@rowcount)

• Se tiene una variable que indica el estado o resultado de mover el cursor (@@sqlstatus)– Exitoso: se alcanzó una fila válida– Hay un error al tratar de tomar la fila– Ya se procesaron todas las filas

Page 47: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Notas adicionales para fetch

• fetch siempre mueve el apuntador a la siguiente fila válida en el conjunto respuesta– Algunos servidores permiten regresarse a una fila

anterior– Cerrar y reabrir un cursor hace que el apuntador

siempre señale al comienzo• Por default, fetch siempre retorna una fila

– Algunos servidores permiten cambiar este defaullt– Sintaxis:

set cursor rows number for cursor_name– Ejemplo:

set cursor rows 5 for biz_book

Page 48: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Prácticas recomendadas para desarrollo

• Siempre especificar el modo del cursor en la sentencia declare

• Como los cursores pueden demandar muchos recursos, evitar dejar abiertos los cursores por mucho

• Si se ejecuta la misma operación en cada fila del cursor, hay que buscar una alternativa

Page 49: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo de cursordeclare books_csr cursor forselect title_id, type, pricefrom titlesfor read onlygo

-- List all business and mod_cook books. Show business books

-- at 8% increase in price. This cursor allows you to-- selectively manipulate a subset of the rows while-- retaining a single result set.declare @title_id tid,

@type char(12),@price money

open books_csr -- initial fetchfetch books_csr into @title_id, @type, @price

Page 50: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo de cursor

while @@sqlstatus = 0

begin

if @@sqlstatus = 1

begin

raiserror 30001 "select failed"

close books_csr

deallocate cursor books_csr

return

endif @type="business"

select @title_id, @type,CONVERT(money,@price*1.08)

else

if @type="mod_cook"

select @title_id, @type, @price

-- subsequent fetches within loop

fetch books_csr into @title_id, @type, @price

end

Page 51: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo de cursor

close books_csr

deallocate cursor books_csr

go

• Results:- - ------------------------

BU1032 business 21.59

- - ------------------------

BU1111 business 12.91

- - ------------------------

BU2075 business 3.23

- - ------------------------

BU7832 business 21.59

- - ------------------------

MC2222 mod_cook 19.99

- - ------------------------

MC3021 mod_cook 2.99

Page 52: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

• Los cursores no son la única manera de ejecutar una tarea• Alternativa: usar caseselect title_id, type,

case typewhen "business" then price * $1.08when "mod_cook" then priceend

from titleswhere type in ("business", "mod_cook")

• Alternativa: hacer dos consultas:select title_id, type, price * $1.08

from titleswhere type = "business"

select title_id, type, pricefrom titleswhere type = "mod_cook"

Alternativas al uso de cursores

Page 53: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo de cursor

declare title_author_csr cursor forselect authors.au_id, au_fname, au_lname, titlefrom titles, authors, titleauthorwhere titles.title_id = titleauthor.title_idand authors.au_id = titleauthor.au_idorder by upper(au_lname), upper(au_fname)for read only

go

set nocount on --Turns off display of rows affecteddeclare @fname varchar(20), @lname varchar(40),        @title varchar(80), @au_id char(11),        @old_au_id char(11)open title_author_csrfetch title_author_csr into @au_id, @fname, @lname, @title

Page 54: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo de cursor

while @@sqlstatus = 0  begin     if @@sqlstatus = 1       begin          raiserror 23000 "Select failed."         return       end     if @au_id <> @old_au_id       begin         print "   "         print "%1! %2! is the author of these books:",

@fname, @lname       end     print "    %1!", @title     select @old_au_id = @au_id     fetch title_author_csr into @au_id, @fname, @lname,

@title  end

Page 55: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

close title_author_csrdeallocate cursor title_author_csrset nocount off --Turns back on display of rows affected

go

• Resultados:...Ann Dull is the author of these books:        Secrets of Silicon Valley

Marjorie Green is the author of these books:        You Can Combat Computer Stress!       The Busy Executive’s Database Guide

Burt Gringlesby is the author of these books:       Sushi, Anyone?...

Ejemplo de cursor

Page 56: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejercicio con cursores

• Declarar un cursor:declare ca_authors cursor

for select au_lname, au_fname, statefrom pubs2..authorswhere state = "CA"

for read only

• Abrir el cursor:open ca_authors

• Tomar tres filas y mostrarlas:fetch ca_authorsfetch ca_authorsfetch ca_authorsselect @@rowcount

Page 57: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejercicio con cursores

• Cerrar el cursor:close ca_authors

• ¿Cómo se pueden tomar más de una fila del cursor?_____________________________________

• Desasignar el cursor:deallocate cursor ca_authors

Page 58: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Actualizar datos usando cursores• Sintaxis simplificada:

update table_name set column1 = { expression | select_statement } [, column2 = { expression | select_statement } ...]where current of cursor_name

• Ejemplo:update titles

set title = "The Executive’s Database Guide"where current of biz_book

• Actualiza la fila a la que señala el apuntador– En la mayoría de casos, esta fila es la tomada más recientemente

• NO mueve el cursor a la siguiente fila• Sólo se pueden actualiza cursores declarados en modo

update

Page 59: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Borrar datos usando cursores

• Sintaxis simplificada:delete [ from ] table_name where current of cursor_name

• Ejemplo:delete from titleswhere current of biz_book

• Borra la fila que está siendo señalada por el apuntador– En la mayoría de casos, esta fila es la tomada más recientemente

• Mueve el aputador del cursor a la fila siguiente• Sólo se pueden actualiza cursores declarados en modo

update

Page 60: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Reglas para actualizar cursores

• La tabla sobre la cual el cursor va a actuar debe estar declarada:– Con un índice único

o– Usando un esquema de bloqueo tipo Datapages o

Datarows

Page 61: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Ejemplo de cursor-- Increase all prices less than the average price by 50%-- Decrease all prices greater than or equal to the average

-- price by 25%

declare title_update cursor

for select title_id, price from titles

for update

declare @avg_price money, -- local variables@title_id  tid,

@price     money

open title_update -- execute cursor

begin tran

-- calculate average price

select @avg_price = avg(price) from titles holdlock

fetch title_update into @title_id, @price

Page 62: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

while @@sqlstatus = 0

begin

if @@sqlstatus = 1 -- error occurredbegin

rollback tranraiserror 21001 "Fetch failed in cursor"

close title_updatedeallocate cursor title_updatereturn

endif @price < @avg_price

update titles --increase by 50%set price = price * $1.50

where current of title_update

elseupdate titles -- decrease by 25%

set price = price * $.75

where current of title_update

Ejemplo de cursor

Page 63: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

if @@error <> 0begin

rollback tran

raiserror 22001 "Update failed"close title_updatedeallocate cursor title_updatereturn

end

fetch title_update into @title_id, @price

end

commit tran

close title_update

deallocate cursor title_update

go

...

Ejemplo de cursor

Page 64: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Cursores y transacciones

• Para cursores for update obtener bloqueos update– Los bloqueos se promueven a bloqueos exclusivos cuando se ejecuta un update

where current of o delete where current of – Si no se promueve, el bloqueo update se libera cuando el cursor se mueve a la

siguiente página de datos• close on endtran es una opción que determina qué le pasa al cursor

en una transacción cuando se llega a un rollback o commit– Cuando está activo, el cursor se cierra después de un rollback o commit– Cuando no está activo:

• El cursor permanece abierto después de un rollback o commit• Las modificaciones basadas en la posición de un cursor se pueden ejecutar fila por

fila, lo cual puede incrementar la concurrencia– Sintaxis:

set close on endtran { on | off }

Page 65: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Cursor a nivel de servidor

• Un cursor a nivel de servidor es aquel creado en un stored procedure

• Ejemplo:create proc proc_fetch_bookasdeclare @title char(30),

@title_id char(6)declare biz_book cursor

for select title, title_id from titleswhere type = "business"

for read onlyopen biz_bookfetch biz_book into @title, @title_id-- additional processing hereclose biz_bookdeallocate cursor biz_bookreturn

Page 66: Aislamiento Bloqueo. Necesidad de aislamiento En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados.

Alcance de cursores a nivel servidor• Los “stored procedures” pueden tomar datos de cursores

creados por un procedimiento que llama al procedimiento dado