Transaction

2010. 1. 7. 13:26·WEB TIP/MS-SQL
출처: DBGuide

Question
굳이 트랜잭션을 걸 필요는 없는 상태이긴 한데 트랜잭션을 해 놓은 거랑 안 해놓은것..
그리고 select 로 하는 건 안 좋고 return 으로 해야 성능이 좋다고 하는게 이게 맞는 이야기 인가요?
CREATE PROC [dbo].[usp111]  
       @U  int
     , @C  tinyint
     , @D tinyint
BEGIN TRAN
     DECLARE @ReturnStatus INT
     
     INSERT INTO [dbo].[test] ([U], [C], [d])

     SELECT  @U, @C, @d
     
     IF @@ERROR <> 0 OR @@ROWCOUNT <> 1 GOTO QuitWithRollback
     
COMMIT TRAN
GOTO EndSave

QuitWithRollback:
     IF (@@TRANCOUNT > 0) 
          BEGIN
               ROLLBACK TRANSACTION
               SELECT 0
               RETURN
          END
EndSave:
     SELECT 1

CREATE PROC [dbo].[usp333]  
       @U  int
     , @C tinyint
     , @D tinyint
AS 
     SET NOCOUNT ON 
 
     DECLARE @Flag TINYINT

     INSERT INTO [dbo].[test] 
	      ( [U]
          , [C]
          , [d]
		  )
     VALUES
          ( @U
          , @C
          , @d
		  )
 
     IF @@ERROR <> 0 OR @@ROWCOUNT <> 1 
          BEGIN
               SELECT @Flag
          END
     ELSE
          BEGIN
               SELECT @Flag
          END
GO


Answer
MSSQL 에서는 기본적으로 암시적 트랜잭션을 사용합니다.
명시적 트랜잭션은 하나이상의 문장에 대한 일관성을 위해서 사용합니다.
그렇기 때문에, 위의 예제처럼 하나의 INSERT 문인 경우에는 굳이 BEGIN TRAN을 사용하지 않아도 크게 문제되지 않습니다.
대신 아래와 같이 여러개의 문장에 대해 트랜잭션 일관성을 유지해야 한다면 반드시 명시적 트랜잭션을 사용해야 합니다.
BEGIN TRAN
      INSERT ... SELECT 1

      IF @@ERROR <> 0
            BEGIN
                  ROLLBACK TRAN
                  RETURN
            END

      INSERT ... SEECLT 2

      IF @@ERROR <> 0
            BEGIN
                  ROLLBACK TRAN
                  RETURN
            END
COMMIT TRAN


결과를 반환하는 것이 아니라 단순한 플래그 값만을 가져오는 것이라면 RETURN을 쓸 수 있지만,
필요한 결과를 여러 개의 값으로 반환해야 한다면 SELECT를 사용해야 합니다.
(SELECT를 사용한다고 해서 크게 성능 문제가 발생하지는 않습니다. 물론, 불필요하다면 SELECT를 사용하지 않아야 하겠지요)

감사합니다.

SQL Server MVP
성대중


'WEB TIP > MS-SQL' 카테고리의 다른 글

동적쿼리  (0) 2012.04.03
[MS-SQL] SQL Server 2005의 데이터 형식  (0) 2011.09.14
Plan Caching  (0) 2010.01.06
SQL 2005 자체 암호화  (0) 2009.08.17
SQL WHILE INSERT  (0) 2009.06.30
'WEB TIP/MS-SQL' 카테고리의 다른 글
  • 동적쿼리
  • [MS-SQL] SQL Server 2005의 데이터 형식
  • Plan Caching
  • SQL 2005 자체 암호화
제프
제프
제프
ZEP@BLOG
제프
전체
오늘
어제
  • 분류 전체보기 (193)
    • 주저리 (4)
    • WEB TIP (5)
      • 웹뉴스 (1)
      • UI (3)
      • ASP (35)
      • HTML-CSS (5)
      • jQuery (7)
      • C# ,ASP.NET (29)
      • MS-SQL (40)
      • Cloud (1)
      • Oracle (24)
      • Exchange 2003 (3)
      • Windows Server (9)
      • 용어 (1)
      • IIS (4)
      • 기타 (1)
      • Redmine (3)
    • 영어 (7)
    • 경제.경영자료 (10)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • MS-SQL
  • IIS
  • jquery
  • 영어
  • 인덱스
  • 숙취
  • asp
  • SQL
  • oracle
  • Git
  • injection
  • c#
  • 암호화
  • SEQUENCE
  • 오라클
  • Convert
  • case
  • ADO
  • Windows2003
  • ASP.NET

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
제프
Transaction
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.