2015-01-20 3 views
2

cftransaction 태그를 이해하는 데있어 근본적인 실패 일 수 있습니다.cftransaction 롤백하지 않음 오류 발생시 테이블 만들기

한 테이블에 여러 개의 Create SQL 문이 있으며 그 중 하나에서 오류가 발생했습니다.이 오류는 거대한 cftransaction에 래핑됩니다. 그러나 오류가 발생하면 Create는 롤백되지 않습니다. 진술.

<cfset variables.x = 0> 
<cftry> 
<cftransaction action="begin"> 
    <cfquery name="variables.qTables" datasource="dev_db"> 
     CREATE TABLE `dev_db`.`tbl_entries_import` ( 
      `p_id` int(11 ) default NULL , 
      `p_Title` varchar(255 ) default NULL , 
      `p_FirstName` varchar(255 ) default NULL , 
      `p_unique_email` varchar(255 ) default NULL , 
      PRIMARY KEY ( `p_ID` ), 
      UNIQUE KEY `p_unique_email_UNIQUE` (`p_unique_email`) 
     ) ENGINE = InnoDB DEFAULT CHARSET = utf8; 
    </cfquery> 
    <cfset variables.x++> 
    <cftransaction action="setsavepoint" savepoint="#variables.x#"/> 

    <cfquery name="variables.qTables" datasource="dev_db"> 
     CREATE TABLE `dev_db`.`tbl_entry2office_import` ( 
      `entryID` int(11 ) NOT NULL default '0', 
      `officeID` int(11 ) NOT NULL default '0' 
      PRIMARY KEY ( `entryID` ) 
     ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; 
    </cfquery> 
    <cfset variables.x++> 
    <cftransaction action="setsavepoint" savepoint="#variables.x#"/> 
</cftransaction> 
<cfcatch> 
    <cfloop from="#variables.x#" to="1" index="variables.y" step="-1"> 
     <cftransaction action="rollback" savepoint="#variables.y#"> 
    </cfloop> 
    <cfdump var="#cfcatch#"> 
</cfcatch> 
</cftry> 

그래서 이어 두 번째로 cfquery (오류가 발생해야하는), 내 스키마에 존재하지 않는 최초의 cfquery에서 테이블을 기대하지만, 현재는 할 것입니다.

답변

6

CREATE TABLE 문은 문서에 따르면, 암시 적 커밋 원인 : "13.3.3 Statements That Cause an Implicit Commit"이 부분 (그들에 대한 동의어)로 나열

문을 암시 적으로 현재 세션에 활성 트랜잭션을 종료로 명령.을 실행하기 전에 COMMIT를 수행 한 경우.

데이터베이스 개체를 정의하거나 수정하는 DDL (데이터 정의 언어) 문입니다. ALTER DATABASE ... 데이터 디렉토리 이름 변경, ALTER EVENT, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, CREATE DATABASE, CREATE INDEX, CREATE PROCEDURE, CREATE SERVER, CREATE TABLE, DROP DATABASE, DROP EVENT, DROP INDEX , 드롭 프로 시저, 드롭 서버, 드롭 테이블, 이름 바꾸기 테이블, 트렁크 테이블.

(내 강조) 아담의 대답에

+3

+1. catch 블록에 drop 문을 넣어야 할 필요가있는 경우 직접 정리할 수 있습니다. 다른 트랜잭션 뉴스에서는 잘라내기를 조심해야합니다. Adam이 게시 한 블록에 있습니다. 어떤 사람들은 테이블에서 삭제하는 대신 잘립니다. 이것은 신속하지만 거래가 아닙니다. –