자바초보생굿
24
2019-03-04 10:58:40
2
624

Mysql 2개 테이블 동시 업데이트 질문입니다.



안녕하세요 DB를 잘 모르는 초보 개발자입니다.


선배님들에게 궁굼한점이 있습니다.


DB 트랜잭션이 궁굼해서 질문 드립니다.


Mysql에서는 멀티 테이블 업데이트를 지원해준다 하여 아래 형식처럼 사용 해볼라고 합니다.


UPDATE TEST A INNER JOIN TEST2 B

ON A.TEST_ID = B.TEST_ID

SET A.TEST_NAME ="TEST1",

B.TEST_NAME = "TEST2"

WHERE A. TEST_ID= "TEST"


이런 형식으로 업데이트를 했을 시 혹시나 TEST 테이블의 A.TEST_NAME은 문제 없이 처리되었지만


TEST2 B.TEST_NAME이 무슨 문제가 생겨 업데이트가 안되었다고 한다면 TEST 테이블도 롤백을 해주나요 ?


아니면 아에 두개 테이블 같이 처리가 안되는건가요 ?

0
  • 답변 2

  • 르매
    560
    2019-03-07 17:33:29

    네, 부분 실패가 일어나도 트랜잭션 보장됩니다.


    아래는 tt2 테이블의 col2를 UNSIGNED 로 선언하고, 이 컬럼 값을 음수로 UPDATE 시켜서 강제로 tt2 테이블의 UPDATE만 실패하도록 한 예제입니다.

    DROP TABLE IF EXISTS tt1, tt2;
    
    CREATE TABLE tt1 (
        seq int UNSIGNED NOT NULL PRIMARY KEY,
        col1 varchar(10) NOT NULL
    ) ENGINE = InnoDB;
    
    CREATE TABLE tt2 (
        seq int UNSIGNED NOT NULL PRIMARY KEY,
        col1 varchar(10) NOT NULL,
        col2 int UNSIGNED NOT NULL
    ) ENGINE = InnoDB;
    
    INSERT tt1 VALUES (1, 'tt1 old');
    INSERT tt2 VALUES (1, 'tt2 old', 0);
    
    UPDATE tt1
        INNER JOIN tt2 ON tt1.seq = tt2.seq
    SET tt1.col1 = 'tt1 new'
        , tt2.col1 = 'tt2 new'
        , tt2.col2 = -1
    WHERE tt1.col1 = 1;
    
    SELECT * FROM tt1;
    SELECT * FROM tt2;

    UPDATE 실패 후 조회하면, tt1.col1의 값도 변경 전 값을 유지하고 있습니다.

  • 자바초보생굿
    24
    2019-03-12 12:59:05

    @르매

    감사합니다 !! 좋은 하루 되세요~!

  • 로그인을 하시면 답변 을 등록할 수 있습니다.