2016-07-26 4 views
0

아래의 쿼리가 작동합니까? 아니면 명시 적으로 트랜잭션을 사용하고 종료합니까?SET TRANSACTION 격리 수준 커밋되지 않은 읽기 - 트랜잭션 begin 및 end를 명시 적으로 사용해야합니까?

는 그래, 난

SET TRANSACTION isolation level READ uncommitted 

SELECT TOP 100 tblguilds.guild_id, 
       tblguilds.guildname, 
       tblguilds.leaderuserid, 
       tblusersprofile.username 
FROM tblguilds 
     LEFT JOIN tblusersprofile 
       ON tblusersprofile.userid = tblguilds.leaderuserid 
WHERE tblguilds.guild_id NOT IN (SELECT guildcode 
            FROM tblguildapplied 
            WHERE userid = 1) 
ORDER BY Newid() 
+0

내 이해는 트랜잭션 시작/끝 주위에 아무것도 선택하지 마십시오. 선택 사항과 함께 업데이트/삽입은 무언가를하지만 시작/끝 부분에서 _only_를 선택하는 것은 의미가 없습니다. 아마도 누군가 그 사실을 확인할 수있을 것입니다. –

답변

2

예 문제가 해결하지만 전체 세션에 적용된다는 점에 유의 할 것이다 커밋되지 않은 읽기의 위험을 알고있다. 그 select 후에 실행하는 SQL은 그 격리 수준을 사용한다는 것을 의미합니다. WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

트랜잭션을 시작하고 (더 END 트랜잭션이 없음) 커밋 삽입에만 적용됩니다 : 당신이 선택 stmt를 특정 테이블에 저를 제한하려면 다음

가 여기에 자세한 내용을 참조하십시오 NOLOCK 힌트를 사용하는 것을 고려/updates/deletes

참고로 성능 향상을 위해 NOT IN 대신 왼쪽 외부 조인을 사용하도록 쿼리를 수정했습니다.

+0

그래서 각 연결 = 각 세션이 맞다고 말할 수 있습니까? – MonsterMMORPG

+0

@MonsterMMORPG 예.하지만 "격리 수준 설정 ..."명령이 실행 된 동일한 SPID에서 실행되는 모든 기술적으로 정확해야하며 SPID (연결)가 닫히거나 격리 수준이 명시 적으로 재설정/다른 것으로 변경. – objectNotFound