14.3.1 START 트랜잭션이 COMMIT 및 ROLLBACK 구문

START 거래
    [ transaction_characteristic[, transaction_characteristic] ...]

transaction_characteristic:
    일관성 스냅 샷
  | 읽기 쓰기
  | 읽기 전용

[WORK]를 BEGIN
COMMIT [WORK]와 [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK]와 [NO] CHAIN] [[NO] RELEASE] 없습니다
SET의 자동 커밋 = {0 | 1}

이 문은 사용을 제어 제공하는  거래를 :

  • START TRANSACTION 또는  BEGIN 새 트랜잭션을 시작합니다.

  • COMMIT 그 변경 사항을 영구적하고, 현재의 트랜잭션 (transaction)을 범했습니다.

  • ROLLBACK 롤의 변경을 취소, 현재의 트랜잭션 (transaction)를 백업합니다.

  • SET autocommit 비활성화 또는 현재 세션에 대한 기본 자동 커밋 모드를 가능하게한다.

기본적으로 MySQL은 실행됩니다  자동 커밋  활성화 모드. 이것은 바로 디스크에 대한 업데이트 (수정) 테이블, MySQL의 저장 업데이트가 영구적으로하는 문을 실행으로 있다는 것을 의미한다. 변화는 롤백 할 수 없습니다.

문 하나의 시리즈에 대한 암시 적으로 자동 커밋 모드를 해제하려면 사용  START TRANSACTION 문 :

트랜잭션을 시작;
SELECT @A가 : 표 FROM SUM (급여) = WHERE 유형 = 1;
UPDATE 표 2 SET 요약 = @ WHERE 유형 = 1;
범하다;

으로  START TRANSACTION당신과 거래를 종료 할 때까지, 자동 커밋이 비활성화 된 상태로 남아 COMMIT 나  ROLLBACK. 자동 커밋 모드는 이전 상태로 되돌아갑니다.

START TRANSACTION 트랜잭션 특성을 제어하는 ​​여러 가지 개질제를 허용한다. 여러 수식을 지정하려면 쉼표로 구분합니다.

  • WITH CONSISTENT SNAPSHOT 수정은 시작  일관된 읽기  그것을 할 수있는 스토리지 엔진을. 이 경우에만 적용됩니다  InnoDB. 효과는 발행과 동일  START TRANSACTION a로 다음을 SELECT 어떤에서  InnoDB 테이블. 참조  절 15.5.2.3를, "일관된 Nonlocking 읽고" . WITH CONSISTENT SNAPSHOT 수정은 현재의 트랜잭션 (transaction) 변경되지 않는  격리 수준을 , 그래서 현재 격리 수준이 일관된 읽기를 허용 한 경우에만이 일관된 스냅 샷을 제공합니다. 일관된 읽기를 허용하는 유일한 격리 수준이다  REPEATABLE READ. 다른 분리 레벨의 경우,  WITH CONSISTENT SNAPSHOT절은 무시됩니다. 때 MySQL은 5.7.2로, 경고가 생성됩니다  WITH CONSISTENT SNAPSHOT 절이 무시됩니다.

  • READ WRITE 및  READ ONLY 수정 트랜잭션 액세스 모드를 설정합니다. 그들은 허용하거나 트랜잭션에 사용되는 테이블에 대한 변경을 금지합니다. READ ONLY제한은 수정하거나 다른 트랜잭션에 볼 수 있습니다 모두 트랜잭션 및 비 트랜잭션 테이블 잠금에서 거래를 방지; 거래는 여전히 수정하거나 임시 테이블을 잠글 수 있습니다.

    MySQL은에 쿼리에 대한 별도의 최적화를 가능하게  InnoDB 트랜잭션이 읽기 전용으로 알려져있다 테이블. 지정은  READ ONLY 이러한 최적화가 읽기 전용 상태가 자동으로 판별 할 수없는 경우에 적용됩니다 보장합니다. 참조  섹션 9.5.3을, "최적화 InnoDB의 읽기 전용 거래" 더 많은 정보를 얻을 수 있습니다.

    접근 모드를 지정하지 않으면, 디폴트 모드가 적용된다. 기본이 변경되지 않는 한, 그것은 읽기 / 쓰기. 모두를 지정하는 것은 허용되지 않습니다  READ WRITE 과  READ ONLY 같은 성명에서.

    읽기 전용 모드에서, 그것은으로 만든 테이블을 변경할 수 남아  TEMPORARY DML 문을 사용하여 키워드를. DDL 문으로 변경은 영구 테이블로, 허용되지 않습니다.

    기본 모드를 변경하는 방법을 포함하여 트랜잭션 액세스 모드에 대한 자세한 내용은 다음을 참조 섹션 14.3.6, "SET 트랜잭션 구문"을 .

    경우  read_only 시스템 변수가 사용 가능으로, 명시 적으로 트랜잭션을 시작  START TRANSACTION READ WRITE 요구  SUPER 권한을.

중대한

(예 : JDBC 등) MySQL 클라이언트 응용 프로그램을 작성에 사용되는 대부분의 API는 (때로는한다) 대신에 보내는 사용할 수 있습니다 트랜잭션을 시작하는 자신의 방법을 제공하는  START TRANSACTION 클라이언트에서 문을. 참조  25 장,  커넥터 및 API에 대한 자세한 내용은, 당신의 API에 대한, 또는 문서를.

명시 적으로 자동 커밋 모드를 해제하려면 다음 문을 사용합니다 :

SET의 자동 커밋 = 0;

설정에 따라 자동 커밋 모드를 해제 한 후  autocommit 제로 변수 (예에 대한 것과 같은 트랜잭션 안전 테이블의 변경  InnoDB 또는  NDB) 즉시 영구적으로하지 않습니다. 당신은 사용해야  COMMIT 디스크에 변경 사항을 저장하거나  ROLLBACK 변경 사항을 무시.

autocommit 세션 변수이며, 각 세션에 대해 설정해야합니다. 각각의 새로운 연결을 위해 자동 커밋 모드를 사용하지 않으려면의 설명을 참조하십시오  autocommit에서 시스템 변수를  제 6.1.5, "서버 시스템 변수" .

BEGIN 과  BEGIN WORK 의 별칭으로 지원되는  START TRANSACTION 트랜잭션을 시작합니다. START TRANSACTION 표준 SQL 구문이고, 임시 트랜잭션을 시작하는 좋은 방법이며, 수정 허용 BEGIN 하지 않습니다.

BEGIN 문은 사용과 다른  BEGIN 시작 키워드  BEGIN ... END 화합물 문을. 후자는 트랜잭션을 시작하지 않습니다. 참조 섹션 14.6.1를, "BEGIN ... END 복합 문 구문" .

노트

저장된 모든 프로그램 (저장 프로 시저 및 함수, 트리거, 이벤트), 파서 취급 이내  BEGIN [WORK] (a)의 시작으로  BEGIN ... END 블록. 와이 컨텍스트에서 트랜잭션을 시작  START TRANSACTION 하는 대신.

옵션  WORK 키워드에 대한 지원  COMMIT 및  ROLLBACK한,  CHAIN 그리고  RELEASE 절을. CHAIN 및 RELEASE 거래 완료 추가 제어에 사용될 수있다. 의 값은  completion_type 시스템 변수는 기본 완료 동작을 결정합니다. 참조  섹션 6.1.5, "서버 시스템 변수"를 .

AND CHAIN 절은 현재 종료하자마자 시작 새로운 트랜잭션을 발생, 새로운 트랜잭션 방금 종료 트랜잭션과 같은 분리 레벨을 갖는다. RELEASE 절은 현재 트랜잭션을 종료 한 후 현재 클라이언트 세션을 분리하도록 서버를 발생합니다. 포함  NO 키워드를 억제  CHAIN 또는  RELEASE 경우에 유용 할 수 있습니다 완료,  completion_type 시스템 변수가 체인의 원인 또는 기본적으로 완료를 해제하도록 설정되어 있습니다.

트랜잭션을 시작하면 보류중인 트랜잭션이 커밋됩니다. 참조  섹션 14.3.3, "는 암시 적 커밋 원인 문" 자세한 내용을.

트랜잭션을 시작도 함께 획득 한 테이블 잠금이 발생  LOCK TABLES 하면 실행했던 것처럼, 발매 예정을  UNLOCK TABLES. 트랜잭션을 시작하기로 취득하는 글로벌 읽기 잠금을 해제하지 않습니다  FLUSH TABLES WITH READ LOCK.

최상의 결과를 얻으려면, 거래는 하나의 거래 안전 스토리지 엔진에 의해 관리 만 테이블을 사용하여 수행해야합니다. 그렇지 않으면, 다음과 같은 문제가 발생할 수있다 :

  • 둘 이상의 트랜잭션 안전 저장 엔진 (예에서 테이블을 사용하는 경우  InnoDB) 및 트랜잭션 격리 수준되지 않습니다  SERIALIZABLE, 하나의 트랜잭션이 커밋 할 때 같은 테이블을 사용하는 다른 지속적인 거래 만 일부 변경을 볼 가능성이있다 첫 번째 트랜잭션에 의해 만들어진. 즉, 트랜잭션의 원 자성이 혼합 된 엔진과 발생할 수 있습니다 일관성을 보증 할 수 없습니다. (혼합 엔진 트랜잭션이 빈번하지 않으면 사용할 수  SET TRANSACTION ISOLATION LEVEL 로 분리 레벨을 설정할  SERIALIZABLE 필요에 따라 트랜잭션 단위에서).

  • 당신이 트랜잭션 내에서 트랜잭션 안전하지 않은 테이블을 사용하는 경우, 해당 테이블의 변경에 관계없이 자동 커밋 모드의 상태를 한 번에 저장됩니다.

  • 당신이 실행하는 경우  ROLLBACK 트랜잭션 내에서 비 트랜잭션 테이블을 업데이트 한 후 문을 ER_WARNING_NOT_COMPLETE_ROLLBACK 경고가 발생합니다. 트랜잭션 안전 테이블에 대한 변경 사항은 nontransaction 안전 테이블에 대한 변경 사항을 롤백하지만되지 않습니다.

각 트랜잭션에, 한 덩어리에 바이너리 로그에 저장됩니다  COMMIT. 롤백 트랜잭션은 기록되지 않습니다. ( 예외 :. 비 트랜잭션 테이블에 대한 수정은 롤백 할 수 없습니다 롤백 트랜잭션이 비 트랜잭션 테이블에 대한 수정이 포함 된 경우, 전체 트랜잭션이 함께 기록됩니다  ROLLBACK비 트랜잭션 테이블에 대한 수정이 복제되도록 끝에 문.) 참조  섹션 6.4.4, "바이너리 로그" .

당신은와의 거래에 대한 격리 수준 또는 액세스 모드를 변경할 수 있습니다  SET TRANSACTION 문을.참조  섹션 14.3.6, "SET 트랜잭션 구문"을 .

위로 롤링 (오류가 발생하면, 예를 들어)을 명시 적으로 요청하는 데 사용하지 않고 암시 적으로 발생할 수있는 느린 동작 할 수있다. 이 때문에,  SHOW PROCESSLIST 표시  Rolling back 에서  State 세션의 열뿐만 아니라, 명시 적으로 수행 롤백 용  ROLLBACK 문장뿐만 아니라 내재 롤백 대한.


[MySQL] alter table 명령어

※ 경고
높이뜬새의 모르는 사람이 없는 팁시리즈 입니다.
이 팁시리즈는 지면낭비라는 항의시에 즉각 중단됩니다.


alter table 명령어는 모르시는 분이 없듯이 테이블의 스키마를 변경 할 수 있게 끔 해주는 아주 유용한 명령어입니다.
alter table 명령어가 없으면 아주 끔찍한 일이 벌어질 수도 있습니다. create table...과 drop table의 남발!! 정말 끔찍하지 않습니까? 그런데 테이블의 스키마가 무엇이냐구요? 

이것 역시 모르시는 분이 단 한사람도 없겠지만 쉽게 말해서 테이블의 구조라고 이해하시면 됩니다. 관계형 데이타베이스를 이용할려면 이놈들을 속성(attribute)들로 뭉쳐진 의미있는 정보의 단위로 이끌어 내야 하는데 이러한 것을 엔티티(Entity)라고 합니다. 정확히 말하면 이 엔티티의 구조를 설명한 게 스키마입니다! 이 스키마는 논리적 스키마와 물리적 스키마로 분리해서 부르는데 특정회사의 데이타베이스에 맞게 스키마를 표현하게 되면 물리적 스키마라고 부릅니다.
엔티티가 물리적 스키마에 의해서 실제 데이타베이스에 적용된 것이 테이블입니다. 더 자세한 사항은 시중에 나와 있는 데이타베이스 설계 관련 서적을 참고하세요! 없는 실력으로 더 자세한 설명은 도저히 무리입니다.^^

alter table 명령어는 각 회사의 데이타베이스에 따라서 약간씩 차이가 있습니다. 여기서는 제가 맨날 까먹는 alter table 명령어 중 MySQL 용 몇개를 오로지 안까먹기 위해서 적어둘려고 합니다. 사실 팁은 아닙니다.^^

일단 alter table 명령어를 쓰기 위해서 간단한 테이블을 하나 만들겠습니다. 테이블 이름은 mytable이고 컬럼은 id와 name만 가지고 있는 아주 간단한 예제용 테이블입니다.
 

mysql> create table mytable ( 
        ->id varchar(12) not null, 
        ->name varchar(20) not null );
 

아주 simple 하고 좋은데 id와 name외에 주소를 뜻하는 addr 컬럼을 추가해 봐야 하겠습니다.

[테이블에 새로운 컬럼 추가하기]

형식) alter table [테이블명] add column [추가할 컬럼명] [추가할 컬럼 데이타형]
 

mysql> alter table mytable add column addr varchar(70) not null;


뒤에 not null 을 안 붙이면 null 허용으로 컬럼이 추가됩니다. 위의 명령어에 의해서 addr 이라는 컬럼이 mytable에 추가 되었습니다. 그런데 주소를 뜻하는 addr 컬럼의 자릿수가 웬지 부족해 보입니다. varchar(100)으로 늘려봐야 겠습니다.

[테이블의 컬럼 타입 변경하기]

형식) alter table [테이블명] modify column [변경할 컬럼명] [변경할 컬럼 타입]
 

mysql> alter table mytable modify column addr varchar(100) not null;


desc mytable로 확인해 보면 addr 컬럼이 varchar(100)으로 정확하게 변경되었습니다.주소 컬럼에는 맞지 않겠지만 addr 컬럼을 int 형에 null 허용으로 변경해 보고 싶습니다.
 

mysql> alter table mytable modify column addr int;


desc mytable로 확인 해보니 int 형에 null 허용으로 변경되었습니다. 주소가 int 형이라니 말이 안됩니다. int 형이라면 아무래도 나이가 맞을 것 같습니다. addr의 컬럼명 자체를 age 로 바꿔야 겠습니다. 

[테이블의 컬럼 이름 변경하기] 

형식) alter table [테이블명] change column [기존 컬럼명] [변경할 컬럼명] [변경할 컬럼 타입]
 

mysql> alter table mytable change column addr age int not null;


addr 컬럼명이 age 라는 컬럼명으로 정확히 바뀌었습니다. 그치만 애초에 age 컬럼은 필요가 없었습니다. 테이블에서 age 컬럼을 삭제 해야 하겠습니다.

[테이블 컬럼 삭제하기]


형식) alter table [테이블명] drop column [삭제할 컬럼명]
 

mysql> alter table mytable drop column age;


desc mytable로 확인해보니 age 컬럼이 삭제되어져 있습니다. 뭔가 허전합니다. id 컬럼에 인덱스(Index)를 주면 허전함이 달래질 것 같습니다.

[테이블 컬럼에 인덱스 주기]

형식) alter table [테이블명] add index 인덱스명( 인덱스를 줄 컬럼1, 인덱스를 줄 컬럼2,...)
 

mysql> alter table mytable add index myindex( id );


위에서는 myindex 라는 인덱스명으로 id 컬럼에 index 가 추가되었습니다. 인덱스를 줄 컬럼을 한개 이상 써 넣으면 복수개의 컬럼에 대해서도 인덱스를 생성할 수 있습니다. 이번에는 id에 주어진 index 를 삭제해 보겠습니다.

[테이블 컬럼에 인덱스 삭제하기]


형식 ) alter table [테이블명] drop index 인덱스명
 

mysql> alter table mytable drop index myindex;


위에서는 처음에 줬던 index 인 myindex 를 삭제하고 있습니다. 참고로 인덱스를 확인하기 위해서는 아래의 명령어를 쓰시면 됩니다. mytable은 테이블 명입니다.
 

mysql> show index from mytable;


alter table로 인덱스도 추가하고, 날려봤는데 primary key 는 못 만들까요? 당연히 만들수 있습니다. 그대신 primary key 는 조건이 있습니다. primary key를 만들려는 컬럼에 조건이겠지요!!! 레코드에 값이 추가 안 되어있을 때는 괜찮지만, 값이 들어있다면 column 에 null 값이 들어 있는지, 중복된 값이 존재하는 column 인지를 따져봐야 합니다. null 값이 없고, 중복되는 column 이 없다면 primary key를 만들 수 있습니다.


[테이블에 primay key 만들기]


형식 ) alter table [테이블명] add primary key ( 키를 줄 column명1, 키를 줄 column명2, ... );
 

mysql> alter table mytable add primary key ( id );


위에서는 mytable의 id 컬럼에 primary key 를 만들고 있습니다. primary key 는 composite key 가 가능하므로 여러개의 column을 묶어서 primary key 로 사용할 수도 있습니다.


만들어진 primary key를 지워야 할 때도 있습니다.


[테이블에 primay key 삭제하기]

형식) alter table [테이블명] drop primary key;
 

mysql> alter table mytable drop primary key;


위에서는 mytable에 만들었던 primary key를 삭제하고 있습니다. 참고로 primary를 만들때는 index가 자동으로 primary key 컬럼에 추가됩니다.

primary key도 다시 날려버리고 아주 좋습니다. 마지막으로 테이블명을 변경해 보고 싶습니다. 사실 mytable이라는 테이블명이 아주 마음에 안 들었습니다.

[테이블 명 바꾸기]


형식) alter table [원본 테이블명] rename [새로운 테이블명];

mysql> alter table mytable rename utable;


alter table에 대해서 대충 알아 봤습니다. 그 유명한 다른 primary key를 뽀려온 foreign key 에 대한 부분도 정리 했으면 좋겠는데.. 오늘은 제 시간 관계 상 여기서 정리를 끝내겠습니다.

+ Recent posts