복붙노트

[SQL] 하나의 문 주위의 트랜잭션 기능은 무엇입니까?

SQL

하나의 문 주위의 트랜잭션 기능은 무엇입니까?

나는 트랜잭션이 업데이트 한 쌍의 공동 관장 유용 할 수있는 방법을 이해합니다. 내가 이해하지 못하는 것은 내가 본 것 중 90 % 인 거래에서 하나의 문을 포장입니다. 사실, 실제 코드에서 각각 자신의 거래에 싸여 논리적으로 관련된 일련의 거래를 찾을 수 내 경험에서 일반적이지만, 전체가 트랜잭션에 싸여 있지 않습니다.

MS-SQL에서 트랜잭션에 하나의 선택, 하나의 업데이트, 하나의 삽입 또는 단일 삭제 포장에서 어떤 혜택이 있습니까?

나는 이것이 미신 프로그램입니다 생각한다.

해결법

  1. ==============================

    1.그것은 아무것도하지 않는다. (없음 로그인 또는 자르기 테이블로 대량 삽입 등 드문 예외를 제외하고) 모든 개별 SQL 문, 당신은 명시 적으로 여부를 말할 여부 "트랜잭션에서"보기 자동이다 .. (그들은 삽입 할 경우에도 행의 업데이트 또는 삭제 수백만) .

    그것은 아무것도하지 않는다. (없음 로그인 또는 자르기 테이블로 대량 삽입 등 드문 예외를 제외하고) 모든 개별 SQL 문, 당신은 명시 적으로 여부를 말할 여부 "트랜잭션에서"보기 자동이다 .. (그들은 삽입 할 경우에도 행의 업데이트 또는 삭제 수백만) .

    편집 : 트랜잭션 로그 일부 데이터를 기록 할 SQL 서버, 심지어 대량 삽입 및 자르기 테이블의 현재 버전에서는 아래 ... 필립의 코멘트 @에 따라, 다른 작업은하지 않을만큼 있지만. 트랜잭션 관점에서 중요한 차이는, 작업이 다른 유형에, 데이터베이스 테이블의 데이터가 압연 돌아올 수있는 상태에서 로그에없는 수정되는 것입니다.

    이 모든 수단은이 작업이 실패하는 경우가 취소를 할 수 있도록 트랜잭션 로그에 기록됩니다 데이터베이스의 데이터에 문 차종을 변경한다는 것입니다.

    1, "트랜잭션 시작" "트랜잭션을 커밋"및 "롤백 트랜잭션"명령이 제공하는 유일한 기능은 동일한 트랜잭션에 두 개 이상의 개별 SQL 문을 넣을 수 있도록하는 것입니다.

    편집 : (마크의 설명을 강화하는 ...) 예, 이것은 "미신"프로그래밍에 기인 할 수도 있고,이 데이터베이스 트랜잭션의 자연의 근본적인 오해의 표시 될 수 있습니다. 더 자선 해석은 단순히 부적절한 일관성 오버 응용 프로그램과 아직 Emersons의 완곡 어법이의 또 다른 예의 결과이다 :

    어리석은 일관성은 작은 마음의 홉 고블린입니다 작은 정치인과 철학자와 신학자에게 사랑 받을수

  2. ==============================

    2.아직 무엇 이외에 아무것도 - 찰스 Bretana가 말했듯이, "그것은 아무것도하지 않는다".

    아직 무엇 이외에 아무것도 - 찰스 Bretana가 말했듯이, "그것은 아무것도하지 않는다".

    이제까지 관계형 데이터베이스의 "ACID"요구 사항들을? 명령문이 실행되는 동안, 다른 쿼리가 쿼리에 의해 영향을받는 데이터에서 수행 할 수 없습니다 - 즉, "A"는 문장 전체의 작품, 또는 하나가 나던 것을 의미 원자를 의미합니다. 트랜잭션을 BEGIN / COMMIT 여러 문에 의해 수행 된 작업이 잠금 기능을 "확장"하지만 하나의 문에 아무것도 추가하지 않습니다.

    그러나 데이터베이스 트랜잭션 로그는 항상 데이터베이스 (삽입, 업데이트, 삭제) 수정 될 때 기록됩니다. 이것은 옵션을 자극 사람들에게 경향이 사실이 아니다. 네, 대량 삽입 및 복구 모드를 wierdness, 그러나 그것은 여전히에 기록됩니다.

    나는-이름을 드롭도 여기에 격리 수준을 것이다. 이에 안달하는 것은 개별 명령에 영향을 미칠 것이다, 그러나 이렇게하면 여전히 선언 트랜잭션 감싸은 "독립형"쿼리보다 다르게 수행 쿼리하지 않습니다. (그들은 매우 강력하고 매우 다중 문으로 dangeroug 수 있음을 참고 트랜잭션을 선언했다.) "NOLOCK는"삽입 / 업데이트 / 삭제가 적용되지 않습니다 또한 주 - 항상 잠금을 요구하는 작업을.

  3. ==============================

    3.나를 위해, 내가 수동, 한 번 UPDATE 문을 실행할 때 나는, 말, WHERE 절을 잊어 버린 경우 롤백 할 수있는 능력을 가지고 거래 수단에서 하나의 문을 포장. 그것은 나에게 몇 번을 저장하고있다.

    나를 위해, 내가 수동, 한 번 UPDATE 문을 실행할 때 나는, 말, WHERE 절을 잊어 버린 경우 롤백 할 수있는 능력을 가지고 거래 수단에서 하나의 문을 포장. 그것은 나에게 몇 번을 저장하고있다.

    EG

    --------------------------------------------------------------
    CREATE TABLE T1(CPK INT IDENTITY(1,1) NOT NULL, Col1 int, Col2 char(3));
    INSERT INTO T1 VALUES (101, 'abc');
    INSERT INTO T1 VALUES (101, 'abc');
    INSERT INTO T1 VALUES (101, 'abc');
    INSERT INTO T1 VALUES (101, 'abc');
    INSERT INTO T1 VALUES (101, 'abc');
    INSERT INTO T1 VALUES (101, 'abc');
    INSERT INTO T1 VALUES (101, 'abc');
    
    SELECT * FROM T1
    
    
    --------------------------------------------------------------
    /* MISTAKE SCENARIO     (run each row individually) */
    --------------------------------------------------------------
    BEGIN TRAN YOUR_TRANS_NAME_1;   /* open a trans named YOUR_TRANS_NAME_1 */
        UPDATE T1 SET COL2 = NULL;  /* run some update statement */
        SELECT * FROM T1;       /* OOPS ... forgot the where clause */
    ROLLBACK TRAN YOUR_TRANS_NAME_1;    /* since it did bad things, roll it back */
        SELECT * FROM T1;       /* tans rolled back, data restored. */
    
    
    
    --------------------------------------------------------------
    /* NO MISTAKES SCENARIO (run each row individually) */
    --------------------------------------------------------------
    
    BEGIN TRAN YOUR_TRANS_NAME_2;
        UPDATE T1 SET COL2 = 'CBA' WHERE CPK = 4;   /* run some update statement */
        SELECT * FROM T1;               /* did it correctly this time */
    
    COMMIT TRAN YOUR_TRANS_NAME_2           /* commit (close) the trans */
    
    --------------------------------------------------------------
    
    DROP TABLE T1
    
    --------------------------------------------------------------
    
  4. ==============================

    4.한 가지 가능한 이유는 내가 암시 적 트랜잭션을 사용하는 상식을 가지고 어떤 DBMS를 기대할 수 있지만, 그 하나의 문이 트리거를 통해 실행하는 다른 SQL의 무리를 일으킬 수 있다는 것을, 그리고 그들이 거기에 나쁜가는 일에 대해 보호하고 있다는 것입니다 이미 같은 방법으로.

    한 가지 가능한 이유는 내가 암시 적 트랜잭션을 사용하는 상식을 가지고 어떤 DBMS를 기대할 수 있지만, 그 하나의 문이 트리거를 통해 실행하는 다른 SQL의 무리를 일으킬 수 있다는 것을, 그리고 그들이 거기에 나쁜가는 일에 대해 보호하고 있다는 것입니다 이미 같은 방법으로.

    내가 생각할 수있는 다른 것은 어떤 API를 사용하지 않도록 자동 커밋 당신을 허용하는지, 그리고 코드는 경우 누군가가 그 않는 단지로 작성.

  5. ==============================

    5.당신이 명시 적 트랜잭션을 시작하고 DML을 실행하면, 자원이 잠겨 문에 의해 잠겨 및 문의 결과 수동 커밋 또는 롤백 될 때까지 트랜잭션 외부에서 볼 수 없습니다되고.

    당신이 명시 적 트랜잭션을 시작하고 DML을 실행하면, 자원이 잠겨 문에 의해 잠겨 및 문의 결과 수동 커밋 또는 롤백 될 때까지 트랜잭션 외부에서 볼 수 없습니다되고.

    이것은 당신이 또는 필요하지 않을 수도 있습니다 것입니다.

    예를 들어, 당신은 여전히 ​​그들에 잠금을 유지하면서 외부 세계에 대한 예비 결과를 표시 할 수 있습니다.

    이 경우, 따라서 경쟁 조건을 피하고, 첫 번째 커밋하기 전에 잠금 요청을 배치 다른 트랜잭션을 시작

    암시 적 트랜잭션이 커밋되거나 또는 실패 DML 문이 완료된 후 즉시 롤백됩니다.

  6. ==============================

    6.SQL Server는 세션에 대해 자동 커밋을 해제 허용하는 설정이 있습니다. 그것은 몇 가지 클라이언트도 기본 (https://docs.microsoft.com/en-us/sql/t-sql/statements/set-implicit-transactions-transact-sql?view=sql-server-2017 참조)입니다

    SQL Server는 세션에 대해 자동 커밋을 해제 허용하는 설정이 있습니다. 그것은 몇 가지 클라이언트도 기본 (https://docs.microsoft.com/en-us/sql/t-sql/statements/set-implicit-transactions-transact-sql?view=sql-server-2017 참조)입니다

    자신의 거래로 각각의 명령을 참을 수 없어, 프레임 워크 및 / 또는 당신이 사용하는 데이터베이스 클라이언트에 따라 그들을 모두 기본 트랜잭션에 함께 일괄 처리되도록 할 수 있습니다. 명시 적으로 트랜잭션에 그들 각각을 포장하는 것은 명확하게 의도를 선언하고 사실 확인이 자동 커밋에 대한 회사 차원의 정책이없는 경우 특히 관계없이 현재 자동 커밋 설정, 프로그래머가 의도하는 방식을 발생합니다.

    (가) 트란을 시작하면 / (여기에 귀하의 의견에 따라)이 프레임 워크는 순진한 프로그래머를 대신하여 그들을 생성하는 것도 가능하다 트란 명령은 데이터베이스에서 관찰되고있다 커밋합니다. (밀접하게 SQL 코드를 검사하는 방법 많은 개발자들은 프레임 워크에 의해 생성?)

    나는이 질문이 다소 고대에도 불구하고, 여전히 관련이 있기를 바랍니다.

  7. from https://stackoverflow.com/questions/1171749/what-does-a-transaction-around-a-single-statement-do by cc-by-sa and MIT license