공부

공부/Database

동시성 제어(Concurrency Control) 기초 (2) Recoverability

쉬운 코드 채널의 Youtube 영상을 보고 정리한 내용입니다. (2부) concurrency control 기초 : recoverability. 트랜잭션들이 동시에 실행될 때 rollback이 발생하면 어떤 일이 벌어질까요? Unrecoverable Schedule 회복 불가능한 형태의 schedule로, DBMS는 이런 schedule을 허용하지 않는다. 여러 트랜잭션으로 이루어진 schedule에 대해 특정 트랜잭션을 롤백할 때, 다른 트랜잭션은 롤백할 수 없는 경우를 말한다. 예를 들어 k가 h에게 20만원 이체 할 때, h도 자기 계좌에 30만원을 입금하려고 할 때 아래와 같은 순서로 트랜잭션이 수행된다고 하자. (1) T1. k의 계좌 잔액을 읽는 작업 (k_balance -> 100만원) (..

공부/Database

동시성 제어(Concurrency Control) 기초 (1) Schedule과 Serializability

쉬운 코드 채널의 Youtube 영상을 보고 정리한 내용입니다. (1부) concurrency control 기초 : schedule과 serializability. 트랜잭션들이 동시에 실행될 때 isolation을 보장하는 기초 이론 Schedule 여러 transaction들이 동시에 실행될 때 각 transaction에 속한 operation들의 실행 순서 여러 transaction들이 동시에 실행된다면, 시간적 순서를 일종의 '줄'이라고 했을 때 서로 다른 transaction에 속한 operation(예를 들면 한 transaction 내의 쓰기 작업)이 섞여서 줄 서 있을 수 있다. 이렇게 여러 transaction들이 동시에 실행될 때, 각 operation이 어떤 순서로 실행되는지를 설명하..

공부/Java

Java Reflection API 의 헷갈리는 get 메서드 비교하기

getName() vs getCanonicalName() 둘 다 Class 객체나 Package 객체의 이름을 반환한다. 그런데 GetCanonicalName은 객체의 정규화된 이름을 반환한다. - 예시) 내부 클래스를 반환할 때 - getName() : `com.example.OuterClass$InnerClass` - getCanonicalName() : `com.example.OuterClass.InnerClass` - 예시) 배열 이름을 반환할 때 - getName() : `[java.lang.String[]] - getCanocinalName() : `java.lang.String[]` getFields() vs getDeclaredFields() getFields() 는 해당 클래스 또는 인터..

공부/Database

[Real MySQL 8.0] 05. 트랜잭션과 잠금 (2) MySQL의 격리 수준

MySQL의 격리 수준 (Isolation level) 트랜잭션의 격리 수준이란? 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. DIRTY READ NON-REPEATABLE READ PHANTOM READ READ UNCOMMITED 발생 발생 발생 READ COMMITTED 없음 발생 발생 REPEATABLE READ 없음 없음 발생 (InnoDB는 없음) SERIALIZABLE 없음 없음 없음 위 표와 같이 크게 4가지의 격리 수준으로 나뉜다. 격리 수준은 (표의 순서 기준으로) 아래로 갈수록, 다음과 같은 성격을 가지는 것이 일반적이다. 데이터 격리(고립) 정도가 높아진다. 동시 처리 성능도 떨어진다..

공부/Database

[Real MySQL 8.0] 05. 트랜잭션과 잠금 (1) 트랜잭션, MySQL의 잠금

[Real MySQL 8.0]을 읽으며 정리한 내용입니다. 💭 부분 은 좀 더 공부가 필요하거나, 생각해보고 싶은 내용들 ~ 트랜잭션 InnoDB vs MyISAM InnoDB 엔진으로 만든 테이블과 MyISAM 엔진으로 만든 테이블에 트랜잭션 동작을 비교해보자. MyISAM 엔진에서는 부분 업데이트가 발생할 수 있다. 이는 테이블 데이터의 정합성을 맞추는 데 어려움을 준다. 각 테이블에 fdpk 컬럼 값이 3인 레코드를 저장해두고 아래 쿼리를 각각 실행해 중복 키 오류를 발생시켜보자. SET autocommit=ON; INSERT INTO tab_myisam (fdpk) VALUES (1),(2),(3); // MyISAM 테이블에는 1, 2 레코드가 남아있다. INSERT INTO tab_innodb..

공부/JPA

연관 관계 편의 메서드는 써야겠고, Setter는 쓰기 싫어요

학습 과정에서 작성한 글로, 잘못된 내용이 있을 수 있습니다! 피드백은 언제나 감사히 받겠습니다 🙇 연관 관계 편의 메서드가 필요한 이유 JPA를 공부하면서, 연관 관계 편의 메서드를 정의해 사용하는 것이 중요하다는 것을 배웠다. 좀 더 설명해보자면, 다대일 / 일대다 관계를 양방향 매핑하여 사용할 때에는 양 쪽 객체의 연관 관계 상태를 모두 신경써주어야 한다. 연관 관계의 주인이 아닌 쪽은 DB 반영과는 관계가 없다. 하지만 그럼에도 이게 중요한 이유는 ORM을 사용하는 만큼, 신뢰성 있게 객체 상태를 유지하고 객체 그래프 탐색을 가능하게 하기 위함이다. 그런데 이 때 각 객체에서 관계를 설정해주기보다는, 하나의 메서드에서 둘을 동시에 설정해주는 것이 안전하다. 이런 메서드를 연관 관계 편의 메서드 라..

공부/JPA

JPA 기본키 생성 전략과 선택 기준

JPA 엔티티 매핑 중 @Id로 기본 키 매핑을 할 때, 해당 값을 넣어주는 방식으로 여러 가지 선택지가 있다. @Id만 사용하고 다른 설정을 해주지 않으면, 기본 키 값을 직접 할당해야 한다. 하지만 정말 불편할 것이다. 따라서 아래와 같이, @GeneratedValue 어노테이션을 통해 기본키 값을 자동 생성할 수 있다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; 이러한 자동 생성 전략으로도 여러 가지가 있는데, 이 중 무엇을 사용할지 정확히 알고 있지 않다는 것을 깨달아서 정리해보려고 한다. 아래와 같이 하나의 트랜잭션 단위를 가지는 테스트 코드를 실행하여 User 엔티티를 저장할 때, 각 전략에 따라 어떤 일이..

공부/Java

[문제 해결] JDBC ResultSet이 null을 0으로 읽는다?

전제 우아한테크코스 장바구니 협업 미션에서 우리 팀은 주문에 1개의 쿠폰을 적용할 수 있도록 정책을 정하였다. 사용자는 주문 시 쿠폰을 쓸 수도, 안쓸 수도 있기 때문에 ORDERS 테이블의 coupon_id 컬럼은 null을 허용하도록 했다. CREATE TABLE IF NOT EXISTS orders ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, member_id BIGINT NOT NULL, coupon_id BIGINT, delivery_fee BIGINT NOT NULL, status VARCHAR(10) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMEST..

d02
'공부' 카테고리의 글 목록 (2 Page)