Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Sugerencias para implementar transacciones con un grupo de SQL dedicado en Azure Synapse Analytics para desarrollar soluciones.
Qué esperar
Como cabría esperar, el grupo de SQL dedicado admite transacciones como parte de la carga de trabajo de almacenamiento de datos. Sin embargo, para asegurarse de que el rendimiento del grupo de SQL dedicado se mantiene a escala, algunas características están limitadas en comparación con SQL Server. En este artículo se resaltan las diferencias y se enumeran las demás.
Niveles de aislamiento de transacciones
El grupo de SQL dedicado implementa transacciones ACID. El nivel de aislamiento de la compatibilidad transaccional está configurado de forma predeterminada en READ UNCOMMITTED. Para cambiarlo a READ COMMITTED SNAPSHOT ISOLATION, active la opción de base de datos READ_COMMITTED_SNAPSHOT para una base de datos de usuario cuando esté conectada a la base de datos maestra.
Una vez habilitada, todas las transacciones en esta base de datos se ejecutarán bajo el modo READ COMMITTED SNAPSHOT ISOLATION, y no se respetará la configuración de READ UNCOMMITTED a nivel de sesión. Consulte las opciones de ALTER DATABASE SET (Transact-SQL) para obtener más información.
Tamaño de transacción
Una única transacción de modificación de datos tiene un tamaño limitado. El límite se aplica por distribución. Por lo tanto, la asignación total se puede calcular multiplicando el límite por el recuento de distribución.
Para aproximar el número máximo de filas de la transacción, divida el límite de distribución por el tamaño total de cada fila. En el caso de las columnas de longitud variable, considere la posibilidad de tomar una longitud media de columna en lugar de usar el tamaño máximo.
En la tabla siguiente se han realizado las suposiciones siguientes:
- Se ha producido una distribución uniforme de datos
- La longitud media de fila es de 250 bytes.
Gen2
| DWU | Límite por distribución (GB) | Número de distribuciones | Tamaño máximo de transacción (GB) | # Filas por distribución | Número máximo de filas por transacción |
|---|---|---|---|---|---|
| DW100c | 1 | 60 | 60 | 4,000,000 | 240,000,000 |
| DW200c | 1.5 | 60 | 90 | 6,000,000 | 360,000,000 |
| DW300c | 2,25 | 60 | 135 | 9,000,000 | 540,000,000 |
| DW400c | 3 | 60 | 180 | 12,000,000 | 720,000,000 |
| DW500c | 3,75 | 60 | 225 | 15.000.000 | 900,000,000 |
| DW1000c | 7,5 | 60 | 450 | 30,000,000 | 1,800,000,000 |
| DW1500c | 11,25 | 60 | 675 | 45,000,000 | 2,700,000,000 |
| DW2000c | 15 | 60 | 900 | 60.000.000 | 3,600,000,000 |
| DW2500c | 18.75 | 60 | 1125 | 75,000,000 | 4,500,000,000 |
| DW3000c | 22.5 | 60 | 1,350 | 90,000,000 | 5,400,000,000 |
| DW5000c | 37,5 | 60 | 2,250 | 150,000,000 | 9,000,000,000 |
| DW6000c | 45 | 60 | 2,700 | 180,000,000 | 10,800,000,000 |
| DW7500c | 56.25 | 60 | 3,375 | 225,000,000 | 13,500,000,000 |
| DW10000c | 75 | 60 | 4500 | 300,000,000 | 18,000,000,000 |
| DW15000c | 112.5 | 60 | 6,750 | 450,000,000 | 27,000,000,000 |
| DW30000c | 225 | 60 | 13,500 | 900,000,000 | 54,000,000,000 |
Gen1
| DWU | Límite por distribución (GB) | Número de distribuciones | Tamaño máximo de transacción (GB) | # Filas por distribución | Número máximo de filas por transacción |
|---|---|---|---|---|---|
| DW100 | 1 | 60 | 60 | 4,000,000 | 240,000,000 |
| DW200 | 1.5 | 60 | 90 | 6,000,000 | 360,000,000 |
| DW300 | 2,25 | 60 | 135 | 9,000,000 | 540,000,000 |
| DW400 | 3 | 60 | 180 | 12,000,000 | 720,000,000 |
| DW500 | 3,75 | 60 | 225 | 15.000.000 | 900,000,000 |
| DW600 | 4.5 | 60 | 270 | 18.000.000 | 1,080,000,000 |
| DW1000 | 7,5 | 60 | 450 | 30,000,000 | 1,800,000,000 |
| DW1200 | 9 | 60 | 540 | 36 000 000 | 2,160,000,000 |
| DW1500 | 11,25 | 60 | 675 | 45,000,000 | 2,700,000,000 |
| DW2000 | 15 | 60 | 900 | 60.000.000 | 3,600,000,000 |
| DW3000 | 22.5 | 60 | 1,350 | 90,000,000 | 5,400,000,000 |
| DW6000 | 45 | 60 | 2,700 | 180,000,000 | 10,800,000,000 |
El límite de tamaño de transacción se aplica por transacción o operación. No se aplica en todas las transacciones simultáneas. Por lo tanto, cada transacción puede escribir esta cantidad de datos en el registro.
Para optimizar y minimizar la cantidad de datos escritos en el registro, consulte el artículo Procedimientos recomendados de transacciones .
Advertencia
El tamaño máximo de transacción solo se puede lograr para HASH o ROUND_ROBIN tablas distribuidas donde la propagación de los datos es uniforme. Si la transacción escribe datos de forma sesgada en distribuciones, es probable que se alcance el límite antes del tamaño máximo de la transacción.
Estado de transacción
El grupo de SQL dedicado usa la función XACT_STATE() para notificar una transacción con errores mediante el valor -2. Este valor significa que la transacción ha fallado y está marcada solo para rollback.
Nota:
El uso de -2 por la función XACT_STATE para indicar que una transacción con errores representa un comportamiento diferente a SQL Server. SQL Server usa el valor -1 para representar una transacción no confirmada. SQL Server puede tolerar algunos errores dentro de una transacción sin tener que marcarse como no compatibles. Por ejemplo SELECT 1/0 , provocaría un error pero no forzaría una transacción en un estado no confirmable. SQL Server también permite lecturas en la transacción no confirmada. Sin embargo, el "dedicated SQL pool" no permite hacerlo. Si se produce un error dentro de una transacción del pool de SQL dedicado, entrará automáticamente en el estado -2 y no podrá realizar ninguna consulta SELECT adicional hasta que se haya revertido la instrucción. Por lo tanto, es importante comprobar que el código de la aplicación vea si usa XACT_STATE() ya que es posible que tenga que realizar modificaciones de código.
Por ejemplo, en SQL Server puede ver una transacción similar a la siguiente:
SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;
BEGIN TRAN
BEGIN TRY
DECLARE @i INT;
SET @i = CONVERT(INT,'ABC');
END TRY
BEGIN CATCH
SET @xact_state = XACT_STATE();
SELECT ERROR_NUMBER() AS ErrNumber
, ERROR_SEVERITY() AS ErrSeverity
, ERROR_STATE() AS ErrState
, ERROR_PROCEDURE() AS ErrProcedure
, ERROR_MESSAGE() AS ErrMessage
;
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
PRINT 'ROLLBACK';
END
END CATCH;
IF @@TRANCOUNT >0
BEGIN
PRINT 'COMMIT';
COMMIT TRAN;
END
SELECT @xact_state AS TransactionState;
El código anterior proporciona el siguiente mensaje de error:
Msg 111233, Nivel 16, Estado 1, Línea 1 111233; La transacción actual se ha anulado y se han revertido los cambios pendientes. Causa: Una transacción en estado de solo rollback no se había revertido explícitamente antes de una instrucción DDL, DML o SELECT.
No obtendrá el resultado de las funciones ERROR_*.
En el grupo de SQL dedicado, el código debe modificarse ligeramente:
SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;
BEGIN TRAN
BEGIN TRY
DECLARE @i INT;
SET @i = CONVERT(INT,'ABC');
END TRY
BEGIN CATCH
SET @xact_state = XACT_STATE();
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
PRINT 'ROLLBACK';
END
SELECT ERROR_NUMBER() AS ErrNumber
, ERROR_SEVERITY() AS ErrSeverity
, ERROR_STATE() AS ErrState
, ERROR_PROCEDURE() AS ErrProcedure
, ERROR_MESSAGE() AS ErrMessage
;
END CATCH;
IF @@TRANCOUNT >0
BEGIN
PRINT 'COMMIT';
COMMIT TRAN;
END
SELECT @xact_state AS TransactionState;
Ahora se observa el comportamiento esperado. El error de la transacción se administra y las funciones ERROR_* proporcionan valores según lo previsto.
Todo lo que ha cambiado es que el ROLLBACK de la transacción tuvo que ocurrir antes de la lectura de la información de error en el bloque CATCH.
función Error_Line()
También merece la pena tener en cuenta que el grupo de SQL dedicado no implementa ni admite la función ERROR_LINE(). Si tiene esta función en el código, debe quitarla para que sea compatible con el grupo de SQL dedicado. Use etiquetas de consulta en el código en su lugar para implementar la funcionalidad equivalente. Para obtener más información, consulte el artículo LABEL .
Uso de THROW y RAISERROR
THROW es la implementación más moderna para generar excepciones en el grupo de SQL dedicado, pero también se admite RAISERROR. Sin embargo, hay algunas diferencias que merecen la pena prestar atención.
- Los números de mensajes de error definidos por el usuario no pueden estar en el intervalo de 100 000 a 150 000 para THROW
- Los mensajes de error RAISERROR se fijan en 50,000
- No se admite el uso de sys.messages
Limitaciones
El grupo de SQL dedicado tiene algunas otras restricciones relacionadas con las transacciones. Son los siguientes:
- No hay transacciones distribuidas
- No se permiten transacciones anidadas
- No se permiten puntos de salvado
- No hay transacciones con nombre
- No hay transacciones marcadas
- No se admite DDL, como CREATE TABLE dentro de una transacción definida por el usuario.
Pasos siguientes
Para más información sobre la optimización de transacciones, consulte Procedimientos recomendados de transacciones. También se proporcionan guías de procedimientos recomendados adicionales para el grupo de SQL dedicado y el grupo de SQL sin servidor.