반응형

매월 마지막날 출력 쿼리

 

DECLARE @v_YMD CHAR(8)
DECLARE @v_tmp CHAR(8)

SET @v_YMD = '20180201'

WHILE @v_YMD <= '20190601' BEGIN
set @v_tmp = CONVERT(CHAR(8),Dateadd(day, -1, @v_YMD),112)
print @v_tmp
SET @v_YMD = CONVERT(Char(8), DateAdd(month, 1, @v_YMD), 112)
END

반응형

'Database > SQL Server' 카테고리의 다른 글

[MSSQL] 테이블 명세서 쿼리 / SP 명세서  (0) 2022.08.04
트랜잭션 격리수준과 with(nolock) 힌트  (0) 2019.04.29
B-TREE 구조  (0) 2018.11.15
SQL 실행계획  (0) 2018.11.12
[MSSQL] Table Column 속성 변경  (0) 2018.06.25
반응형

C/C++ 에서 소켓통신을 하기 위해 패킷을 구조체로 정의한다.

일반적으로 아래와 같이 선언하여 사용한다.

struct _Socket
{
    int Size;
    char text[50];
} Socket;

해당 구조체로 패킷을 정의하면 패킷의 크기는 어떻게 될까?

int 자료형은 4바이트, char 자료형은 1바이트지만 배열로 선언하여 50 바이트가 된다.

두 값을 더하면 54가 나와야 하지만 sizeof(Socket); 결과는 56바이트가 된다.

왜 이런 결과가 나오는 것일까?

먼저 정답은 패딩비트에 의해 56바이트가 나오게 된다.

대부분의 컴파일러는 CPU가 접근하기 쉬운 위치에 필드를 배치한다. 그러다보니 중간에 빈 공간이 들어가는데 위 예시에서는 2바이트가 추가로 들어가게 된 것이다.

이렇게 추가된 2바이트를 패딩 비트라고 한다.

32bit CPU는 메모리에서 값을 읽어올 때 한번에 4byte(32bit)를 읽어 오고 64bit CPU는 한번에 8byte(64bit)를 읽어온다

 

그러면 이러한 상황을 방지하기 위한 방법이 뭐가 있는지 찾아보니 아래와 같이 구조체를 선언하면 패딩비트가 생성되지 않는다.

#pragma pack(1)
struct _Socket
{
  int Size;
  char text[50];
} Socket;
#pragma pack(pop)

위와 같이 선언한 구조체의 크기를 출력해보면 sizeof(Socket)의 결과가 54가 나오게 된다.

#pragma pack(1)이 뜻하는 바는 구조체에서 가장 큰 바이트로 변수의 크기가 설정되는데 해당 설정을 1바이트로 변경한다는 뜻이다. #pragma pack(pop)을 통해 원래 정렬된 값(4바이트)으로 돌아가게 된다.

#pragma pack(1)과 #pragma pack(pop) 사이에 선언된 모든 구조체에 해당 설정이 적용 된다.

 

#참고 사이트 : https://pangate.com/19

반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

[C++] 숫자만 입력받기 예제  (0) 2017.04.24
[C++] STL(Standard Template Library)  (0) 2017.04.17
반응형

SELECT 문 사용할 때 with(nolock)를 사용하는 경우가 종종 있다.

with(nolock)을 사용하는 이유는 트랜잭션 격리성 때문인데 해당 내용에 대해 정리 글

 

Transaction Isolation Level(트랜잭션 격리 수준)이란?

  - A 트랜잭션이 실행되고 있을 때 다른 B 트랜잭션의 접근 권한에 대한 수준을 이야기 합니다.

  - 트랜잭션 격리 수준 단계가 높아질수록 격리 수준이 높아지며 데이터 일관성은 높아지지만 동시성은 저하 됩니다.

 

Transaction Isolation 관련 문제점

  - Dirty Read : 커밋되지 않은 데이터를 읽어 해당 트랜잭션이 롤백 되면 오류 데이터를 읽을 수 있는 문제점

  - Non-Repeatable Read : 한 트랜잭션이 반복하여 Read 중일 때 다른 트랜잭션이 접근하여 데이터를 변경하여 커밋하여도 커밋된 결과가 반영 되지 않는 문제점

  - Phantom Read : 한 트랜잭션 안에서 일정 범위 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 문제점

 

Transaction Isolation Level 단계

 

  1. Read Uncommitted

 

        - 트랜잭션 실행 중 다른 트랜잭션이 접근 가능(트랜잭션이 격리되지 않음)

        - A트랜잭션이 데이터를 변경 중 일 때 B트랜잭션이 접근하여 커밋되기전 변경된 데이터를 읽을 수 있음.

        - 만약 커밋되지 않고 A트랜잭션이 롤백되면 B트랜잭션의 결과값은 잘못된 데이터가 됨(Dirty Read 발생)

        - Non-Repeatable Read 발생 가능

        - Phantom Read 발생 가능

 

  2.  Read Committed

 

        - 커밋되기 전 바뀐 데이터를 읽을 수 없음.(Dirty Read 발생 X)

        - Non-Repeatable Read 발생 가능

        - Phantom Read 발생 가능

 

  3.  Repeatable Read

        - 항상 한 트랜잭션의 일관성 있는 데이터 읽기를 보장(Dirty Read, Non-Repeatable Read 발생 X)

        - A트랜잭션 실행 중 B 트랜잭션에서 Insert가 발생 후 동일 조건의 Select문의 A트랜잭션과 B트랜잭션의 결과가 달라짐(Phantom Read 발생)

        - A트랜잭션이 실행 중일 때 다른 트랜잭션이 DB의 내용을 변경해도 서로 영향을 미치지 않는다.

 

  4.  Serializable

        - 가장 높은 격리 수준

        - 트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 트랜잭션이 접근 불가

        - Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생 안함.

 

위 내용을 아래 표로 정리하였습니다.

 

 

Dirty Read

Non-Repeatable Read

Phantom Read

Read Uncommitted

O

O

O

Read Committed

X

O

O

Repeatable Read

X

X

O

Serializable

X

X

X

 

* DB별 Default isolation

 

DB

Default isolation

MSSQL

Read Committed

MYSQL

Repeatable Read

ORACLE

Read Committed

 

격리 수준과 with(nolock) 힌트의 관계

    -    With(nolock)힌트는 격리성 제한이 걸린 DataBase Read Uncommitted를 허용한다.(격리성 관련 문제점 발생)

    -    격리성 제약조건 있는 DB에 실시간으로 데이터를 확인할 때 주로 사용한다.

    -    데드락이나 교착상태가 발생하지 않는다.

    -     Rollback이 될 수 있는 데이터까지 읽기 때문에 데이터 일관성은 저하된다.

 

*with(nolock)과 유사한 with(readuncommitted)힌트도 있습니다~!

 

*본문에 사용된 이미지 출처 : https://lng1982.tistory.com/287

반응형

'Database > SQL Server' 카테고리의 다른 글

[MSSQL] 테이블 명세서 쿼리 / SP 명세서  (0) 2022.08.04
SQL 매월 마지막일 출력  (0) 2019.06.20
B-TREE 구조  (0) 2018.11.15
SQL 실행계획  (0) 2018.11.12
[MSSQL] Table Column 속성 변경  (0) 2018.06.25

+ Recent posts