Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Y CONTROL DE CONCURRENCIA
INSTRUCTOR
INGENIERA DE SISTEMAS
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.
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.
En SQL Server las instrucciones equivalentes a las genéricas que acabamos de ver son:
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
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
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?
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.
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.
Para obtener información sobre la arquitectura del registro de transacciones y los elementos
internos,