"the only way to be truly satisfied is to do what you believe is great work."

[Data base]트랜잭션과 쿼리문

트랜잭션의 정의

  • 트랜잭션(Transaction)은 데이터베이스에서 사용되는 더 이상 쪼갤 수 없는 작업 단위를 의미합니다. 즉 하나의 작업이 성공과 실패가 매우 명확합니다.
  • 예시를 들면, 예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 합니다.
  • 이처럼 트랜잭션은 데이터 일관성과 안전성을 보장하기 위해 매우 중요합니다. 특히, 동시에 많은 사용자가 데이터베이스에 접근하는 경우에도 데이터 무결성( 데이터의 Lifecycle 동안 모든 데이터가 얼마나 완전하고, 일관되며, 정확한지를 나타내는 정도)을 보장하기 위해서는 트랜잭션의 개념이 필수적입니다.

{참고}

  • Data life cycle (데이터 생애 주기): 데이터가 태어나고(생성) 부터 죽기(폐기) 까지의 모든 단계를 포함합니다
  • 데이터무결성 :모든 데이터가 얼마나 완전하고, 일관되며, 정확한지를 나타내는 정도)

트랜잭션의 특징

  • 원자성(Atomicity): 트랜잭션 내의 모든 작업이 전부 실행되거나, 전부 실행되지 않아야 합니다. 즉, 트랜잭션 내의 어떤 작업 하나라도 실패하면 트랜잭션 전체가 취소되어야 합니다.
  • 일관성(Consistency): 트랜잭션을 실행하기 전과 후의 데이터베이스 상태가 일관성이 있어야 합니다. 즉, 트랜잭션 실행 전의 데이터베이스 상태에서 정의된 제약 조건을 만족해야 합니다.
  • 독립성(Isolation): 둘 이상의 트랜잭션이 동시에 실행되더라도 각각의 트랜잭션은 서로 영향을 주지 않고 독립적으로 실행되는 것처럼 보이도록 보장해야 합니다.
  • 지속성(Durability): 트랜잭션이 성공적으로 실행되면 그 결과는 영구적으로 저장되어야 합니다. 따라서, 시스템의 어떤 문제가 발생하더라도 트랜잭션의 결과는 보존되어야 합니다.

트랜잭션의 커밋과 롤백

  • 트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit)을 하고, 오류가 발생할 경우 원래 상태대로 롤백(rollback)을 한다.
  • Commit :트랜잭션의 모든 작업이 수행된 후에 작업의 결과, 데이터베이스의 상태 변화를 저장하기 작업 완료를 알려준다. 이 연산을 수행하면 수행했던 트랜잭션이 로그에 저장되고, 후에 Rollback 연산을 수행하는 경우 트랜잭션 단위로 원복을 할 수 있도록 해준다.
  • Rollback : 만약 트랜잭션이 정상적으로 모든 작업을 수행하지 못한 경우에 트랜잭션 수행 전으로 데이터베이스를 원복한다. 트랜잭션의 처리 단위대로 원복할 수 있다.

쿼리문

  • 쿼리문은 데이터베이스에서 데이터를 검색하거나 조작하기 위해 사용되는 문장입니다. 즉, 데이터베이스에서 원하는 정보를 가져오거나 조작하기 위해서는 쿼리문을 작성해야 합니다.
  • 쿼리문은 SQL(Structured Query Language)이라는 언어를 사용하여 작성됩니다. SQL은 데이터베이스에서 데이터를 검색, 추가, 수정, 삭제할 수 있는 기본적인 문법과 구문을 갖추고 있습니다.

inner join

SELECT users.*,place_of_birth
        FROM users
        INNER JOIN palce_of_birth
            ON users.id = place_of_birth_id; 
  • A와 B 교집합이라고 생각하면 편합니다.
  • user테이블의 id와 place_of_birth 테이블의 id가 일치하는 row들에 대해서 inner join을 수행합니다
  • 오정원의 아이디는 5이기 때문에 일치하는 테이블이 없어서 inner join시 보이지 않습니다.

outer join에는 여러가지 종류가 있습니다.

left join

SELECT users.*,place_of_birth
        FROM users
        LEFT JOIN palce_of_birth
            ON users.id = place_of_birth_id; 
  • A-B 차집합이라 생각하면 편합니다.
  • 마찬가지로 id가 일치하는 row들에 대해서 left join을 수행합니다.
  • 오정원에 해당하는 place_of_birth 데이터가 없으므로 null로 나타납니다

right join

SELECT  users.team_id, users.name, users.age
        teams.id, teams.team_name, big_club
        FROM users
        RIGHT JOIN teams
            ON users.team_id = teams_id

제가 한가지 실수한게 있는데 데이터들의 team id,big club와 같은 항목에 공백이 있으면 안됩니다. SQL 코드에서는 _가 있다 생각해주세요.

  • B-A 차집합이라 생각하면 편합니다.
  • users 테이블의 id는 SELECT 하지 않았습니다.
  • 마찬가지로 id가 일치하는 row들에 대해서 right join을 수행합니다.
  • 레알마드리드에 대한 user 데이터가 없으므로 null로 나타납니다.

Full join

SELECT  users.name1, teams.name2
        FROM users
        FULL OUTER JOIN teams ON users.id = teams.teams_id
        ORDER BY users.name1
  • A B 합집합이라 생각하면 편합니다.
  • SELECT문으로 일부 데이터만 가져왔습니다.
  • 서로 데이터가 없는부분은 null로 나타납니다.

'데이터베이스 > Database' 카테고리의 다른 글

[Data base] 정규화  (0) 2023.04.06
[Data base]RDBMS 와 NOSQL  (0) 2023.03.22