목록DATABASE (11)
선진이네

트랜잭션의 격리 수준 을 나누게 된 이유는 이전 글의 Isolation 때문이다! 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할 지 여부를 결정하는 것이 바로! 격리 수준이라는 놈이다! 총 네 가지 녀석이 존재한다. Serializable : 엄격 그리고 또 엄격. 무조건 트랜잭션을 순차적으로만 실행! 여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없다! 따라서 데이터에 문제가 생길 일은 아예 존재할 수가 없다! 하지만, 트랜잭션이 순차적으로만 처리되기에, 동시 처리 성능이 상당히 그리고 또 상당히 떨어진다…! Repeatable Read : 어떤 트랜잭션이 읽은 데이터를 다른 트랜잭션이 수정하더라도 동일한 결과를 반환할 것을 보장..

트랜잭션이란 뭘까... 트랜잭션은 데이터베이스의 상태를 변화시키기 위한 작업 수행의 논리적 단위를 의미한다. SQL 쿼리를 보냄으로써 데이터베이스의 상태가 변화하게되는데, 그 작업 하나하나의 단위가 바로 트랜잭션이다! 그럼 과연 SQL문 하나가 트랜잭션일까? 그렇게 생각할 수 있지만, 사실은 아니다! 하나의 SQL 문이 트랜잭션이라고 가정하고 은행에서의 송금 원리를 생각해보자! A가 B에게 1억의 돈을 송금한다고 생각하자! A가 송금하는 시점에 A의 돈 데이터는 1억이 차감될 것이다. 그 때, B의 잔고는 1억이 추가될 것이다. 근데!! 만약에 A의 이후 로직에서 오류가 발생하여 트랜잭션의 rollback이 일어난다면? A의 돈 데이터는 다시 1억이 될것이다. 하지만, B는 다른 트랜잭션이기에 오류가 발..

이번 프로젝트에서 처음으로 몽고디비를 사용해보며 컬렉션의 데이터가 유실되는 현상을 발견했다. 백업 명령은 다음과 같다. sudo mongodump --db mydb --collection dream --out /ubuntu/home/mongod/backup 백업 데이터를 가져오는 명령은 다음과 같다. sudo mongorestore --db mydb /ubuntu/home/mongod/backup/mydb/dream.bson 이렇게 서버에서 잘 복구된 것을 확인할 수 있고! 이렇게 실제로 데이터를 확인하면 잘 돌아온 것을 확인할 수 있다! 그럼 이제 컬렉션의 데이터가 왜 삭제됐을지에 대해서 알아내야한다. 구글링을 열심히 해도 몽고디비에서 데이터가 임의로 삭제되는 일은 없다고 한다. 그래서 나의 추측 JP..

식별 관계와 비식별 관계에 대한 명확한 정의를 위하여 PART2를 통해 돌아왔다. 실제 전문가분과의 대화를 통해 더욱 더 자세한 개념들에 대하여 알 수 있게 되었다. 식별 관계란, 부모 테이블의 PK가 자식 테이블에서도 PK로서 유일성을 보장할 수 있는 컬럼인 관계이다. 아래 자동차와 바퀴 테이블을 보면, 자동차라는 객체가 존재해야 바퀴의 위치를 지정할 수 있다. 자동차가 없는데 바퀴의 위치라는 녀석이 존재할 수는 없다. 이처럼 자식 테이블이 부모 테이블에 온전히 종속되는 관계가 바로 식별 관계라는 결론을 얻게 되었다. 그렇다면, 비식별 관계는 무엇일까? 부모 테이블과 자식 테이블의 관계에 있어서, 부모 테이블과 자식 테이블이 FK로 연관되어 있는 상태이다. 자식 테이블에서는 그 연관되어 있는 컬럼으로 ..
식별 관계와 비식별 관계에 대한 명확한 이해가 있어야 ERD 설계의 의미가 있다고 생각하여 글을 남긴다. 개발자라면 매핑에 대한 기본 지식은 있을 것이라 생각한다. 두 개의 테이블을 매핑하는데 일대일, 일대다, 다대일, 다대다 등의 관계는 명확히 알고 있을 것이라 생각한다. 그렇다면 그러한 관계를 매핑하는데 있어 식별 관계와 비식별 관계는 무슨 차이가 있을까? 식별 관계는 종속적인 관계로 이해하고 있다. 고객 테이블에서 상품 테이블을 매핑하고자 할 때, 하나의 고객은 여러개의 상품을 구매할 수 있기에 일대다 관계임은 명확하고, 고객이 없더라도 상품 테이블에 새로운 행이 생성될 수 있기에 비식별 관계라고 생각했다. 당근마켓의 레퍼런스 ERD를 보았을 때도, 일대다의 비식별 관계로 매핑되어 있었다. 이유를 ..
#1.test_user 라는 이름으로 새로운 schema를 생성하고, 해당 스키마를 사용하시오. create schema test_user; use test_user; select * from user; #2.만약 user 라는 테이블이 존재한다면 삭제하시오. DROP TABLE if exists `user`; #3.test_user 에 다음 조건을 만족하는 user 테이블을 생성하시오. create table `user` ( `id` varchar(40) not null, `password` varchar(40) not null, `name` varchar(40) not null, `email` varchar(40) not null, `age` int not null )ENGINE=InnoDB; #4...
데이터베이스 객체에 데이터를 입력 use ssafydb; -- 회원 정보 table 생성. -- table name : ssafy_member -- column -- idxintauto_incrementsPK -- useridvarchar(16)not null -- usernamevarchar(20) -- userpwdvarchar(16) -- emailidvarchar(20) -- emaildomainvarchar(50) -- joindatetimestampdefaultcurrent_timestamp create table ssafy_member ( idx int auto_increment primary key, userid varchar(16) not null, username varchar(20),..
SELECT 문에서 GROUP BY 절을 사용하는 경우 Database는 쿼리 된 테이블의 행을 그룹으로 묶음 Database는 선택 목록의 집계 함수를 각 행 그룹에 적용하고 각 그룹에 대해 단일 결과 행을 반환 GROUP BY 절을 생략하면 Database는 선택 목록의 집계 함수를 쿼리 된 테이블의 모든 행에 적용 SELECT 절의 모든 요소는 GROUP BY 절의 표현식, 집계 함수를 포함하는 표현식 또는 상수만 가능 -- 각 부서별 최고 급여를 받는 사원의 부서번호, 사번, 이름, 급여. -- join 이용 select a.department_id, e.employee_id, e.first_name, a.smax from employees e join ( select department_id, ..
조건에 맞는 데이터를 뽑기 위해 만족하는지 판단 연산 순서는 FROM, WHERE, SELECT 순 AND 연산이 OR 연산보다 우선 실행 정렬을 위한 order by (decs 옵션은 내림차순 정렬) -- 부서번호가 50인 사원중 급여가 7000이상인 사원의 -- 사번, 이름, 급여, 부서번호 select employee_id, first_name, salary, department_id from employees where department_id = 50 and salary >= 7000; -- 근무 부서번호가 50, 60, 70에 근무하는 사원의 사번, 이름, 부서번호 select employee_id, first_name, department_id from employees where depar..
: FROM 절에 나열된 테이블에서 모든 열을 선택 ALL : 선택된 모든 행을 반환 (ALL이 default므로 생략 가능) DISTINCT : 선택된 모든 행 중에서 중복 행 제거 column : FROM 절에 나열된 테이블에서 지정된 열을 선택 expression : 표현식은 값으로 인식되는 하나 이상의 값, 연산자 및 SQL 함수의 조합을 뜻함 alias : 별칭 use ssafydb; -- 모든 사원의 모든 정보 검색. select * from employees; -- 사원이 근무하는 부서의 부서번호 검색. select department_id from employees; -- 사원이 근무하는 부서의 부서번호 검색.(중복제거) select distinct department_id from emp..