ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트렌젝션(transections)과 ACID
    SQL/sql 문법(mysql, mariaDB) 2024. 5. 15. 14:20

    ▤ 목차

      데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위

      트렌젝션(transections)

      논리적인 단위별 데이터 처리를 말한다.

      ⌨ 트렌젝션(transections)이 시작되는 단위

      클라이언트가 아래와 같은 작업을 진행하면 작업단위가 실행된다.
      -INSERT
      -DELETE
      -UPDATE

       

      💻트렌젝션(transections) 작업단위 종류

      • commit

      : DB 서버 자료 원본에 갱신한다.

      • rollback

      : 클라이언트의 작업(INSERT, DELETE, UPDATE)을 취소한다.

       

      👏 중요 (transection 상태 바꾸기/ 상태 확인하기)

      mariaDB와 java는 auto - commit으로 기본 설정되어 있다.

      수동으로 바꿀 수 있다.

      상태 바꾸기

      SET autocommit = FALSE;

      이렇게 바꾸면 내 ram에서만 실행되는 것이다.

      이제부터 작업단위는 log를 찍게된다.

      즉, 앞으로의 작업단위들로 인해 transection이 실행될 것이다.

       

      상태 확인하기

      SHOW VARIABLES LIKE 'autocommit%';

      상태를 확인할 수 있다.

       

       ACID 조건

      데이터베이스의 트랜잭션이 안전하게 수행되기 위해서 ACID조건을 충족해야한다.

      ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다.

      ACID 조건

      • Atromicity (원자성)
      • consistency (일관성)
      • Isolation (격리성)
      • durablity (영속성)

       

      ✏️ 원자성(Atomicity)

      • 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다.
      • 모두 진행하거나 모두 실행되지 않거나 둘 중 하나의 작업만 되어야한다.
      원자성 보장
      트랜잭션에서 원자성은 숭행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서 이전 커밋된 상태를 임시 영역에 따로 저장함으로써 보장한다.
      현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날려버리고 임시 영역에 저장했던 상태로 롤백 한다. 따라서 트랜잭션의 원자성은 롤백 세그먼트(segment)에 의해 보장된다.
      ※세그먼트(segment)란? 분할, 구분등의 의미를 가진다.

       

      ✏️ 일관성(Consistency)

      • 트랜잭션이 성공적으로 완료되면 일관적인 DB 상태를 유지한다.
      • 실행 전, 후 모두 데이터의 타입이 일관되어야한다. 데이터나 시스템이 가진 고정요소 혹은 상태가 유지되어야한다는 의미이다. (기본키, 외래키, 무결성 제약조건 등 비명시적 일관성의 조건 포)

      ✏️ 격리성(Isolation)

      • 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것을 말한다.
      • 트랜잭션 수행할때 서로 간섭할 수 없다. 각 트랜잭션은 격리되어 있어 독립적으로 수행되기 때문에 다른 트랜잭션의 작업 내용을 알 수 없다.

      ✏️ 영속성(Durability)

      • 지속성이라고도 부른다.
      • 성공적으로 수행된 트랜잭션의 결과는 안정적, 영구적으로 반영된다.
      • 해당 트랜잭션에 대한 log가 남아서 저장되어야 한다.

      😊정리

      (참고 사이트)

      https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-acid-%EC%84%B1%EC%A7%88/

       

      [데이터베이스] 트랜잭션의 ACID 성질 - 하나몬

      트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛을 말한다. 데이터베이스 트랜잭션은 ACID라는 특성을 가지고 있다. ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안

      hanamon.kr

       

       

      ROLLBACK

      ⌨ transections 시작

      원하는 값은 insert 해준다.

      INSERT INTO jik1(jikwon_no, jikwon_name, buser_num)
      VALUES (32, 'james',20);
      
      INSERT INTO jik1(jikwon_no, jikwon_name, buser_num)
      VALUES (33, 'oscar',20);

      이 작업은 원본 DB에 들어가지 않은 값이다.

      만약 이 작업들이 마음에 들지 않으면 작업을 취소할 수 있다.

      💻 transections 끝

      ROLLBACK;

      롤백을 사용하면 트랜젝션은 작업을 하지 않은 상태로 돌아간다.

      나의 ram에서도 결과가 취소된다.

       

      👏 SAVEPOINT 세이브포인트

      SET autocommit = FALSE;

       

      트랜잭션의 길이가 길어지는데 오류가 발생하게 된 경우를 생각해보자.

      오류가 발생하지 않는 부분까지 다시 작업을 수행해야한다.

      따라서 확실한 부분에 대해서 롤백이 되지 않도록 중간 저장 지점을 지정할 수 있다.

      이 중간 저장 지점을 SAVE POINT라고 한다.

      UPDATE jik1 SET jikwon_pay=7777 WHERE jikwon_no=8; -- 직원번호 8번의 PAY를 7777로 변경
      SELECT * FROM jik1; -- 7777로 변경 확인
      SAVEPOINT aa; -- aa라는 이름으로 savepoint 생성
      
      UPDATE jik1 SET jikwon_pay=6666 WHERE jikwon_no=10; -- 직원번호 10번의 pay를 6666으로 변경
      SELECT * FROM jik1; -- 변경 확인
      ROLLBACK TO savepoint aa; -- aa savepoint로 롤백
      
      UPDATE jik1 SET jikwon_pay=5555 WHERE jikwon_no=7; -- 7번 직원 pay를 5555로 변경
      COMMIT;
      SELECT * FROM jik1;

      위의 경우 commit까지 실행한 후 결과는 어떻게 될까?

      10번의 직원은 pay가 적용되지 않았을 것이다.

      8번 직원의 jikwon_pay column은 77777번 직원의 jikwon_pay column은 5555변경되었을 것이다.

       

      COMMIT

       transections 시작

      원하는 값은 insert 해준다.

      INSERT INTO jik1(jikwon_no, jikwon_name, buser_num)
      VALUES (32, 'james',20);
      
      INSERT INTO jik1(jikwon_no, jikwon_name, buser_num)
      VALUES (33, 'oscar',20);

      이 작업은 원본 DB에 들어가지 않은 값이다.

      만약 이 작업들이 정상적으로 작동이 된다면 원본DB에 적용해 줄 수 있다.

      💻 transections 끝

      COMMIT;

      작업단위를 갱신된다.

      원본 DB에 들어가 결과를 가져오면 확인할 수 있다.

       

    Designed by Tistory.