2012-03-22 20 views
16

A menudo vi a mucha gente usar la declaración SELECT dentro de una transacción. A menudo utilizo insert/update/delete solo en la transacción. Simplemente no entiendo cuál es la utilidad de poner una declaración SELECT dentro de la transacción.Transacción de SQL Server y instrucción SELECT

Me dieron una respuesta que .... SELECT dentro de la transacción pueden ver los cambios realizados por otros Insert/Update/Delete declaraciones anteriores en esa transacción, una declaración SELECT fuera de la transacción no puede.

declaración anterior es cierto o no?

¿Es esta la única razón por la que las personas ponen la declaración SELECT dentro de la transacción? Por favor discuta todos los motivos en detalle si es posible. gracias

+1

Si está utilizando el nivel de aislamiento predeterminado ('READ COMMITTED') - entonces sí - un' SELECT' fuera de la transacción ** ** no verá ningún inserto o actualizaciones que haya hecho una transacción, hasta que esos sean realmente comprometido. –

Respuesta

16

intenta hacer esto y usted entenderá:

Abrir dos nuevas consultas en SSMS (llamémosle A y B a partir de ahora uno) y en A, crear una tabla simple como esto :

create table transTest(id int) 
insert into transTest values(1) 

ahora, haga lo siguiente:

hacer select * from transTest en ambos.Verá el valor 1

en una carrera:

set transaction isolation level read committed 

En B dirigido:

begin transaction 
insert into transTest values(2) 

en una carrera:

select * from transTest

verá que la la consulta no finalizará porque está bloqueada por la transacción en A

En B dirigido:

commit transaction 

volver a una y verá que la consulta terminó

Repita la prueba con set transaction isolation level read uncommitted en un verá que la consulta no será bloqueado por el transacción

+0

gracias por la respuesta. ¿Puedes decirme qué significa "compromiso de lectura de nivel de aislamiento"? ¿Qué significa "nivel de aislamiento leído comprometido" según su explicación será bloqueo de tabla pero quiero bloquear solo fila. así que guíame gracias – Thomas

+0

cada transacción tiene un nivel de aislamiento. La confirmación de lectura es la predeterminada y significa que solo leerá los datos que ya haya guardado en el disco. Es posible que desee google un poco sobre los niveles de aislamiento, hay un montón de material por ahí y sería difícil resumir aquí – Diego

5

Una de las principales razones que se me ocurre (la única razón, de hecho) es si usted desea establecer un diferente isolation level, por ejemplo:

USE AdventureWorks2008R2; 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
BEGIN TRANSACTION; 

SELECT * FROM HumanResources.EmployeePayHistory; 

SELECT * FROM HumanResources.Department; 

COMMIT TRANSACTION; 

Para los comandos SELECT individuales sin embargo, estoy no tan seguro, a menos que tenga una razón para ir por el otro lado y establecer LEER SIN COMPROMISO en los casos en que el tiempo de respuesta/maximizar la concurrencia es más importante que los datos precisos o válidos.

< especulación certeza = "75%" > Si la instrucción SELECT solo se encuentra dentro de una transacción explícita, sin alterar los niveles de aislamiento, estoy bastante seguro de que no tendrá ningún efecto en absoluto. Las declaraciones individuales son, por sí mismas, transacciones que se confirman automáticamente o se revierten por error. </especulación >

Cuestiones relacionadas