2010-06-21 15 views
7

Las transacciones SQL se utilizan para insertar, actualizar, pero ¿deberían usarse para leer registros?¿Debo utilizar transacciones SQL mientras leo registros?

+0

gracias a todos los que responden, ojalá hubiera la opción de marcar todas las respuestas, pero no las hay. gracias por dar ejemplos, por dar un enlace a la explicación de bloqueo, para obtener una explicación de cómo actualizar los datos en milisegundos gracias. – user287745

Respuesta

8

Si está consultando todos los registros en una sola consulta y tira de ellos de una vez, no es necesario. Todo está envuelto en una transacción implícita. Es decir, incluso si recupera un millón de registros, e incluso si otros procesos están cambiando los registros, verá cómo se veían todos los registros de un millón en el mismo momento.

Las únicas veces que realmente necesitaría una transacción (y, a menudo, una sugerencia de bloqueo específica) en un único proceso de lectura son:
- Usted lee los registros "fragmentario" y necesita nada más para alterar los valores mientras tu piensas [Por ejemplo, un conjunto de registros conectado en ADO al que luego pasa el cursor.]
- Lee algunos datos, hace algunos cálculos y luego lee algunos datos relacionados, pero en el supuesto de que nada haya cambiado mientras tanto.


En resumen, es necesario transacciones cuando se desea otros procesos se detengan interfiera con sus datos entre sentencias SQL.

3

El ajuste de transacciones no es necesario para lecturas puras.

Dentro de su instrucción SQL, Lock Hints debe tener cuidado de devolverle los datos correctos (http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx).

En un nivel de servidor, puede establecer niveles de aislamiento de transacciones (http://msdn.microsoft.com/en-us/library/ms173763.aspx).

Editar

Explicando pura lee

Si todo comunicado su SQL tiene este tipo de lecturas, entonces no es necesario para envolver en una transacción

SELECT Col1, Col2 
From Table1 
    INNER JOIN Table2 
     ON Table1.Id = Table2.Table1Id 

Si está leyendo resultados que puede verse afectado por otras transacciones en paralelo, entonces debe envolver una transacción. Por ejemplo:

BEGIN TRANSACTION 

INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21) 
UPDATE AccountSummary SET Balance = Balance + 43.21 

SELECT @Balance = Balance FROM AccountSummary 

COMMIT TRANSACTION 

Realmente, se le acaba devolviendo el equilibrio, pero toda la transacción monetaria tiene que trabajar en dos lugares.

+0

En el siguiente ejemplo, cualquier proceso simultáneo podría interferir con las tablas que está leyendo. No hay escritura de datos, pero hay cálculos entre lecturas relacionadas. Como tal, una TRANSACCIÓN sería necesaria para proteger el estado de los datos. INSERT INTO @temp SELECCIONAR ; ; SELECCIONAR ; – MatBailie

+0

Eso no es una lectura pura sin embargo. Raj dijo que "el ajuste de transacciones no es necesario para lecturas puras". –

+0

Defina "lectura pura", el ejemplo que di no inserta, actualiza o elimina a otra cosa que no sea una variable. [Podría ser una INT, una variable de tabla o algún otro contenedor de datos para facilitar los cálculos que definirán el comportamiento de la lectura final] – MatBailie

2

Si necesita la información más actualizada en milisegundos, puede usar una transacción que se construye con TransactionOptions con IsolationLevel de Serializable.

Esto afectaría el rendimiento, ya que bloqueará la mesa (o partes de la mesa), por lo que debe averiguar si realmente la necesita.

Para la mayoría de los usos, si está haciendo una lectura, no necesita cerrar una transacción (suponiendo que solo está haciendo lecturas en una operación).

Realmente depende de su aplicación, qué datos requiere y cómo lo usa.

Por ejemplo, si realiza una lectura y, dependiendo de los resultados, escribe o actualiza, pero es fundamental que los datos que acaba de leer sean actuales, probablemente deba ajustar toda la lógica en una sola transacción.

1

No, las transacciones generalmente no son necesarias para leer datos y ralentizarán también sus lecturas de datos.

Le sugiero que lea sobre el término ATOMIC. Esto lo ayudará a comprender para qué son las transacciones.

1

Es posible realizar transacciones, pero ¿para qué sirve?

Puede establecer el nivel de aislamiento apropiado para una sesión completa de SQL Server utilizando la instrucción SET TRANSACTION ISOLATION LEVEL.

Esta es la sintaxis de SQL Server Books Online:

SET TRANSACTION ISOLATION LEVEL 
    { 
     READ COMMITTED 
     | READ UNCOMMITTED 
     | REPEATABLE READ 
     | SERIALIZABLE 
    } 

Locking in Microsoft SQL Server.

0

Cuando modificó algo en una transacción, puede usar la instrucción de lectura para verificar si la operación tiene efecto, justo antes de confirmar.

0

Las transacciones están destinadas a evitar problemas de concurrencia cuando una transacción lógica se asigna a varias consultas SQL. Por ejemplo, para una cuenta bancaria, si está transfiriendo dinero de una cuenta a otra, primero restará el monto de la cuenta y luego lo agregará a otra (o viceversa). Pero, si ocurre algún error entre su base de datos, se encontraría en un estado no válido (puede haber restado el importe de una cuenta pero no la ha agregado a otra). Entonces, si está leyendo todos sus datos en una consulta, no necesita una transacción.

Cuestiones relacionadas