Sei sulla pagina 1di 11

MANEJO DE TRANSACCIONES, BLOQUEOS

Y CONTROL DE CONCURRENCIA

JOSE LUIS HERRERA PATIÑO

SERVICIO NACIONAL DE APRENDIZAJE (SENA)


ESPECIALIZACION TECNOLOGICA EN GESTION Y SEGURIDAD BASE DE
DATOS
CALI
2019
MANEJO DE TRANSACCIONES, BLOQUEOS
Y CONTROL DE CONCURRENCIA

JOSE LUIS HERRERA PATIÑO

INSTRUCTOR

ZULMA MILENA PATIÑO CARDENAS

INGENIERA DE SISTEMAS

SERVICIO NACIONAL DE APRENDIZAJE (SENA)


ESPECIALIZACION TECNOLOGICA EN GESTION Y SEGURIDAD BASE DE
DATOS
CALI
2019
INTRODUCCION
Es importante que el administrador de la base de datos. Conozca las diferentes herramientas que
tiene la base de datos para optimizarla. Como por ejemplo los indexes, las consulta demoradas.
Al tener las bases de datos optimizadas evita que en el momento de la operación de la organización.
Pierda tiempo al esperar el resultado de una consulta o que la base de datos esta bloqueada por un
error
¿Cómo es el manejo transaccional en una base de datos dependiendo del motor
utilizado?

Una transacción es una unidad única de trabajo. Si una transacción tiene éxito, todas las
modificaciones de los datos realizadas durante la transacción se confirman y se convierten en una
parte permanente de la base de datos. Si una transacción encuentra errores y debe cancelarse o
revertirse, se borran todas las modificaciones de los datos.

SQL Server funciona en los modos de transacción siguientes:

Transacciones de confirmación automática


Cada instrucción individual es una transacción.

Transacciones explícitas
Cada transacción se inicia explícitamente con la instrucción BEGIN TRANSACTION y se termina
explícitamente con una instrucción COMMIT o ROLLBACK.

Transacciones implícitas
Se inicia implícitamente una nueva transacción cuando se ha completado la anterior, pero cada
transacción se completa explícitamente con una instrucción COMMIT o ROLLBACK.

Transacciones de ámbito de lote


Una transacción implícita o explícita de Transact-SQL que se inicia en una sesión de MARS
(conjuntos de resultados activos múltiples), que solo es aplicable a MARS, se convierte en una
transacción de ámbito de lote. Si no se confirma o revierte una transacción de ámbito de lote cuando
se completa el lote, SQL Server la revierte automáticamente.

Transacciones en SQL Server

En SQL Server las instrucciones equivalentes a las genéricas que acabamos de ver son:

 BEGIN TRANSACTION o BEGIN TRAN: marca el inicio de una transacción. TRAN es


un sinónimo de TRANSACTION y se suele usar más a menudo por abreviar.
 ROLLBACK TRANSATION o ROLLBACK TRAN: fuerza que se deshaga la
transacción en caso de haber un problema o querer abandonarla. Cierra la transacción.
 COMMIT TRANSACTION O COMMIT TRAN: confirma el conjunto de operaciones
convirtiendo los datos en definitivos. Marca el éxito de la operación de bloque y cierra la
transacción.

Los niveles de aislamiento que nos ofrece SQL Server son:

 SERIALIZABLE: No se permitirá a otras transacciones la inserción, actualización o


borrado de datos utilizados por nuestra transacción. Los bloquea mientras dura la misma.
 REPEATABLE READ: Garantiza que los datos leídos no podrán ser cambiados por otras
transacciones, durante esa transacción.
 READ COMMITED: Una transacción no podrá ver los cambios de otras conexiones hasta
que no hayan sido confirmados o descartados.
 READ UNCOMMITTED: No afectan los bloqueos producidos por otras conexiones a la
lectura de datos.
 SNAPSHOT: Los datos seleccionados en la transacción se verán tal y como estaban al
comienzo de la transacción, y no se tendrán en cuenta las actualizaciones que hayan sufrido
por la ejecución de otras transacciones simultáneas.

¿Cuándo se genera un bloqueo?

Errores al procesar la transacción

Si un error impide la terminación correcta de una transacción, SQL Server revierte


automáticamente la transacción y libera todos los recursos que mantiene la transacción. Si
se interrumpe la conexión de red del cliente con una instancia de Motor de base de datos,
las transacciones pendientes de la conexión revierten al estado anterior cuando la red
notifica la interrupción a la instancia. Si la aplicación cliente falla o si el equipo cliente se
bloquea o se reinicia, también se interrumpe la conexión y la instancia de Motor de base de
datos revierte las conexiones pendientes cuando la red le notifica la interrupción. Si el
cliente cierra la aplicación, las transacciones pendientes se revierten.

Si se produce el error de una instrucción en tiempo de ejecución (como una infracción de


restricciones) en un archivo por lotes, el comportamiento predeterminado de Motor de base
de datos consiste en revertir solamente la instrucción que generó el error. Puede modificar
este comportamiento con la instrucción SET XACT_ABORT. Una vez ejecutada la
instrucción SET XACT_ABORT ON, los errores de instrucciones en tiempo de ejecución
hacen que se revierta automáticamente la transacción actual. Los errores de compilación,
como los de sintaxis, no se ven afectados por SET XACT_ABORT. Para obtener más
información, vea SET XACT_ABORT (Transact-SQL).

Cuando se producen errores, la acción correctora (COMMIT o ROLLBACK) debería


incluirse en el código de aplicación. Una herramienta eficaz para controlar los errores, los
de transacciones, incluidos es el Transact-SQL intente... DETECTAR la construcción. Para
obtener más información y ejemplos que incluyan transacciones, vea TRY...CATCH
(Transact-SQL). Empezando por SQL Server 2012, puede usar la instrucción THROW para
generar una excepción y transferir la ejecución a un bloque CATCH de un bloque TRY...
DETECTAR la construcción. Para obtener más información, vea THROW (Transact-SQL).

Errores de compilación y tiempo de ejecución del modo de confirmación automática

En el modo de confirmación automática, a veces parece que Motor de base de datos ha


revertido un proceso por lotes completo en vez de revertir solamente una instrucción SQL.
Esto sucede si se trata de un error de compilación, no en el caso de un error en tiempo de
ejecución. Los errores de compilación impiden que Motor de base de datos genere un plan
de ejecución, por lo que no se ejecuta ninguna instrucción del proceso por lotes. Aunque
parezca que se han revertido todas las instrucciones anteriores a la que generó el error, el
error impidió que se ejecutara ninguna instrucción del proceso por lotes. En el ejemplo
siguiente, no se ejecutó ninguna de las instrucciones INSERT del tercer proceso por lotes
debido a un error de compilación. Parece que se han revertido las dos primeras
instrucciones INSERT cuando, en realidad, nunca se ejecutaron.

SQL
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUSE (3, 'ccc'); -- Syntax error.
GO
SELECT * FROM TestBatch; -- Returns no rows.
GO

En el ejemplo siguiente, la tercera instrucción INSERT genera un error de clave principal


duplicada en tiempo de ejecución. Las dos primeras instrucciones INSERT eran correctas y
se han confirmado, por lo que permanecen después de producirse el error en tiempo de
ejecución.

SQL
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUES (1, 'ccc'); -- Duplicate key error.
GO
SELECT * FROM TestBatch; -- Returns rows 1 and 2.
GO

Motor de base de datos utiliza la resolución demorada de nombres, en la que no se


resuelven los nombres de los objetos hasta la ejecución. En el ejemplo siguiente, se
ejecutaron y confirmaron las dos primeras instrucciones INSERT y las dos filas permanecen
en la tabla TestBatch después de que la tercera instrucción INSERT generara un error en
tiempo de ejecución al hacer referencia a una tabla que no existe.

SQL
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBch VALUES (3, 'ccc'); -- Table name error.
GO
SELECT * FROM TestBatch; -- Returns rows 1 and 2.
GO
¿Cómo se libera un bloqueo?

Determinar las consultas que mantienen bloqueos

A menudo, los administradores de bases de datos necesitan identificar el origen de bloqueos


que reducen el rendimiento de la base de datos.

Por ejemplo: está sospechando que el bajo rendimiento del servidor puede ser debido a los
bloqueos. Al consultar sys.dm_exec_requests, encuentra varias sesiones en un modo
suspendido y con un tipo de espera que indica que un bloqueo es el recurso por el que se
está esperando.

Al realizar la consulta sys.dm_tran_locks los resultados muestran que existen muchos


bloqueos pendientes, pero las sesiones a las que se permitió usar los bloqueos no tienen
ninguna solicitud activa que aparezca en sys.dm_exec_requests.

Este ejemplo demuestra un método para determinar la consulta que obtiene el bloqueo, el
plan de la consulta y la pila de Transact-SQL en el momento de obtención del bloqueo. Este
ejemplo también muestra cómo el destino del emparejamiento se utiliza en una sesión de
Extended Events.

Para realizar esta tarea debe usar el Editor de consultas de SQL Server Management Studio
y llevar a cabo el siguiente procedimiento.

EJEMPLO
Cómo determinar las consultas que mantienen bloqueos
 -- Perform cleanup.
1. IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE
name='FindBlockers')
2. DROP EVENT SESSION FindBlockers ON SERVER
3. GO
4. -- Use dynamic SQL to create the event session and allow creating a
-- predicate on the AdventureWorks database id.
5. --
6. DECLARE @dbid int
7.
8. SELECT @dbid = db_id('AdventureWorks')
9.
10. IF @dbid IS NULL
11. BEGIN
12. RAISERROR('AdventureWorks is not installed. Install
AdventureWorks before proceeding', 17, 1)
13. RETURN
14. END
15.
16. DECLARE @sql nvarchar(1024)
17. SET @sql = '
18. CREATE EVENT SESSION FindBlockers ON SERVER
19. ADD EVENT sqlserver.lock_acquired
20. (action
21. ( sqlserver.sql_text, sqlserver.database_id,
sqlserver.tsql_stack,
22. sqlserver.plan_handle, sqlserver.session_id)
23. WHERE ( database_id=' + cast(@dbid as nvarchar) + ' AND
resource_0!=0)
24. ),
25. ADD EVENT sqlserver.lock_released
26. (WHERE ( database_id=' + cast(@dbid as nvarchar) + ' AND
resource_0!=0 ))
27. ADD TARGET package0.pair_matching
28. ( SET begin_event=''sqlserver.lock_acquired'',
29. begin_matching_columns=''database_id, resource_0,
resource_1, resource_2, transaction_id, mode'',
30. end_event=''sqlserver.lock_released'',
31. end_matching_columns=''database_id, resource_0,
resource_1, resource_2, transaction_id, mode'',
32. respond_to_memory_pressure=1)
33. WITH (max_dispatch_latency = 1 seconds)'
34.
35. EXEC (@sql)
36. --
37. -- Create the metadata for the event session
38. -- Start the event session
39. --
40. ALTER EVENT SESSION FindBlockers ON SERVER
41. STATE = START
42.
43.  Después de la ejecución de una carga de trabajo en el servidor, emita las
instrucciones siguientes en el Editor de consultas para buscar consultas que aún
mantengan bloqueos.
44.  --
45. -- The pair matching targets report current unpaired events using
46. -- the sys.dm_xe_session_targets dynamic management view (DMV)
47. -- in XML format.
48. -- The following query retrieves the data from the DMV and stores
49. -- key data in a temporary table to speed subsequent access and
50. -- retrieval.
51. --
52. SELECT
53. objlocks.value('(action[@name="session_id"]/value)[1]', 'int')
54. AS session_id,
55. objlocks.value('(data[@name="database_id"]/value)[1]', 'int')
56. AS database_id,
57. objlocks.value('(data[@name="resource_type"]/text)[1]',
'nvarchar(50)' )
58. AS resource_type,
59. objlocks.value('(data[@name="resource_0"]/value)[1]',
'bigint')
60. AS resource_0,
61. objlocks.value('(data[@name="resource_1"]/value)[1]',
'bigint')
62. AS resource_1,
63. objlocks.value('(data[@name="resource_2"]/value)[1]',
'bigint')
64. AS resource_2,
65. objlocks.value('(data[@name="mode"]/text)[1]', 'nvarchar(50)')
66. AS mode,
67. objlocks.value('(action[@name="sql_text"]/value)[1]',
'varchar(MAX)')
68. AS sql_text,
69. CAST(objlocks.value('(action[@name="plan_handle"]/value)[1]',
'varchar(MAX)') AS xml)
70. AS plan_handle,
71. CAST(objlocks.value('(action[@name="tsql_stack"]/value)[1]',
'varchar(MAX)') AS xml)
72. AS tsql_stack
73. INTO #unmatched_locks
74. FROM (
75. SELECT CAST(xest.target_data as xml)
76. lockinfo
77. FROM sys.dm_xe_session_targets xest
78. JOIN sys.dm_xe_sessions xes ON xes.address =
xest.event_session_address
79. WHERE xest.target_name = 'pair_matching' AND xes.name =
'FindBlockers'
80. ) heldlocks
81. CROSS APPLY lockinfo.nodes('//event[@name="lock_acquired"]') AS
T(objlocks)
82.
83. --
84. -- Join the data acquired from the pairing target with other
85. -- DMVs to return provide additional information about blockers
86. --
87. SELECT ul.*
88. FROM #unmatched_locks ul
89. INNER JOIN sys.dm_tran_locks tl ON ul.database_id =
tl.resource_database_id AND ul.resource_type = tl.resource_type
90. WHERE resource_0 IS NOT NULL
91. AND session_id IN
92. (SELECT blocking_session_id FROM sys.dm_exec_requests
WHERE blocking_session_id != 0)
93. AND tl.request_status='wait'
94. AND REPLACE(ul.mode, 'LCK_M_', '' ) = tl.request_mode
95.
96.  Después de identificar los problemas, quite cualquier tabla temporal y la sesión
de evento.
97. DROP TABLE #unmatched_locks
98. DROP EVENT SESSION FindBlockers ON SERVER
¿De qué forma se hace seguimiento a las transacciones en un determinado momento?

Todas las bases de datos de SQL Server tienen un registro de transacciones que registra todas las
transacciones y las modificaciones que cada transacción realiza en la base de datos.

El registro de transacciones es un componente esencial de la base de datos. Si hay un error del


sistema, ese registro será necesario para devolver la base de datos a un estado coherente.

Para obtener información sobre la arquitectura del registro de transacciones y los elementos
internos,

Operaciones compatibles con el registro de transacciones


El registro de transacciones permite las siguientes operaciones:

 Recuperación de transacciones individuales.


 Recuperación de todas las transacciones incompletas cuando se inicia SQL Server .
 Puesta al día de una base de datos, un archivo, un grupo de archivos o una página
restaurados hasta el momento exacto del error.
 Permitir replicación transaccional.
 Compatibilidad con soluciones de alta disponibilidad y recuperación ante desastres:
Grupos de disponibilidad Always On, creación de reflejo de la base de datos y trasvase de
registros.

¿Cuándo múltiples usuarios acceden en un mismo instante de tiempo a un recurso de


la Base de Datos, como gestiona el motor la concurrencia?
Bibliografía

campusmvp. (s.f.). Fundamentos-de-SQL-Transacciones. Obtenido de Fundamentos-de-SQL-


Transacciones.: https://www.campusmvp.es/recursos/post/Fundamentos-de-SQL-
Transacciones.aspx

combodo. (s.f.). ITop. Obtenido de ITop: https://www.combodo.com/itop

microsoft. (s.f.). determine-which-queries-are-holding-locks. Obtenido de determine-which-


queries-are-holding-locks: https://docs.microsoft.com/es-es/sql/relational-
databases/extended-events/determine-which-queries-are-holding-locks?view=sql-server-
ver15

microsoft. (s.f.). Documentos de Ayuda. Obtenido de transactions-transact-sq:


https://docs.microsoft.com/es-es/sql/t-sql/language-elements/transactions-transact-
sql?view=sql-server-ver15

microsoft. (s.f.). the-transaction-log-sql-server. Obtenido de the-transaction-log-sql-server:


https://docs.microsoft.com/es-es/sql/relational-databases/logs/the-transaction-log-sql-
server?view=sql-server-ver15

Potrebbero piacerti anche