[컴][DB] MySQL 에서 transaction 과 isolation level

mysql / mysql race condition / read shadow read /lock

MySQL 에서 transaction 과 isolation level

아래는 정리되지 않은 글이다. 정리는 추후에...

mysql 의 default isolation level

MySql 의 InnoDB 는 Repeatable-read 가 기본 isolation level 이다.

기본 sql standard

sql에서 Repeatable-read 는 아래 3가지를 만족한다.

  • dirty reads (non committed data)
  • non repeatable reads (executing the same query twice should return the same values)
  • allows phantom reads (new rows are visible).

MY SQL 의 default isolation 변경법

실행시에 --transaction-isolation=level option 을 사용하면 된다.(참고)

현재 isolation level 확인방법

-- to check the current isolation level
SHOW variables like 'tx_isolation'

isolation levels

  • SQL Server 트랜잭션 잠금 및 행 버전 관리 지침 | Microsoft Docs
  • SERIALIZABLE : REPEATABLE READ 보다 더 엄격 하다. XA transactions 이나 concurrency 와 deadlocks의 troubleshooting 을 위해서
  • REPEATABLE READ : 가장 높은 수준의 consistency(일관성)
  • READ COMMITTED : locking 에 대한 overhead 가 더 중요해서 precise consistency 와 반복적인 결과들이 덜 중요할때 사용할 수 있다.
  • READ UNCOMMITTED : READ COMMITTED 와 같다. 단 dirty read(select 가 nonlocking 된 상태로 수행된다.) 가 허용된다.(consistency 를 보장하지 않는다.)
격리 수준 커밋되지 않은 읽기 반복되지 않는 읽기 가상
READ UNCOMMITTED
READ COMMITTED 아니요
REPEATABLE READ 아니요 아니요
스냅숏 아니요 아니요 아니요
직렬화 가능 아니요 아니요 아니요

가상읽기(Phantom read)가 가능하기 때문에 만약 아래와 같은 2개의 transaction 이 동시에 실행되는 경우 transaction 1 의 첫 SELECT 와 두번째 SELECT 가 다른 결과를 같게 된다. (두번째 select 의 결과 row 가 더 많을 것이다.)

-- Transaction 1
SELECT * FROM table1
SELECT * FROM table1

-- Transaction 2
INSERT INTO table1 ...

아래와 같은 transaction 이 동시에 일어나는 경우, INSERT 가 2번 된다. 이를 막기 위해 insert 시에 index 를 지정해서 넣어주면, 같은 index 에 insert 를 피할 수 있다. 하지만 문제는 끝부분에서 중복이슈는 없지만, 중복 이슈와 상관없는 경우에도 insert 가 실패하기 때문에 문제가 될 수 있다.

그리고 상품이 2개이상이 동시에 열리는 경우 2개의 상품의 마지막투자가 같은 순간에 이뤄지면, 둘다 같은 index 를 next 로 잡아서 insert 를 할 것이고, 그것이 충돌을 일으킬 수 있다.

해결책

결국 queue 를 두는 방식으로, 즉 worker 로 넘기는 방식을 쓰기로 했다. 아무래도 그래야만 consistency 가 유지될 수 있다고 본다.

-- Transaction 3
SELECT * FROM table1 ...
-- insert depending on the result of the select
INSERT INTO table1 ... 

See Also

  1. 쿠…sal: [컴][db] RDBMS 내부를 설명한 자료

References

  1. Understanding MySQL Isolation Levels: Repeatable-read | Official Pythian® Blog
  2. MySQL :: MySQL 8.0 Reference Manual :: 15.5.2.1 Transaction Isolation Levels

[컴][하드웨어] GPU 의 memory bandwidth 와 VRAM



GPU 의 memory bandwidth 와 VRAM

다음은 ref. 1 의 "Memory Bandwidth, Memory Capacity" 부분을 의역한 내용이다.

----

메모리 대역폭(memory bandwidth) 는 GPU 의 VRAM 에 한번에 얼마나 많은 양을 넣고(copy to), 뺄수(copy from) 있는 지를 알려준다. 당연한 이야기지만, 같은 해상도(resolution)에서 시각효과(visual effects) 가 많을 수록 더 높은 memory bandwidth 가 필요하다.(더 많은 data 를 한 번에 옮겨야 하니.)

VRAM 의 총용량은 GPU 의 다른 중요한 요소다. 필요한 VRAM 의 양이 현재 가능한 리소스를 넘어선다면, 게임은 계속 돌겠지만, 이 부족한 memory 부분만큼 CPU 의 main memory 를 이용하게 된다.

이것은 GPU 가 DRAM 에서 data 를 가져오게 돼서, GPU 의 VRAM 에서 가져오는 시간보다 더 오래 걸리게 된다. 결국 이것이 게임화면의 버벅임을 만들게 된다.

그래서 VRAM 의 양이 중요하긴 하지만, 일부 low-end 그래픽카드는 쓸데없이 VRAM 이 많은 경우가 있다. 즉, VRAM 이 부족해 지기 전에 다른 부분에서 bottleneck 이 걸릴 수가 있다. 그러므로 이런 경우를 방지하기 위해 benchmark 결과등을 잘 살펴서 구매를 할 필요가 있다.

---

Memory Bandwidth Specification


GPU 와 VRAM 간의 memory bandwidth 는 GDDR 의 spec. 을 확인해 보면 된다. GDDR6가 요즘 나오고 있다. 고대역폭을 위해 새롭게 만든 HBM(High bandwidth memory) 이라는 스펙도 있다. 이녀석은 GDDR6가 나오고는 경쟁력이 확실히 많이 떨어졌다.

GDDR6의 데이터 전송 속도는 최대 18Gbps로 고성능 GPU의 384비트 메모리 버스에선 864GB/s의 대역폭((18Gbps * 384bit )/ 8bit = 864GB/s)이 나온다.



References

[컴][웹][보안] KISA 웹 취약점 점검 요청


무료 취약점 점검 / 웹 취약점 점검 요청


KISA 웹 취약점 점검 요청방법


필요한 요소

  1. 중소기업 확인서
  2. 신청서(신청서 다운로드)
  3. 공문

공문에는 아래의 내용이 포함되어 있어야 합니다.
 1. 한국인터넷진흥원으로부터 웹취약점 점검 시 발생할 수 있는
    홈페이지 접속 중단, 서버 장애 등 위험성에 대해서 고지를 받았고 인지하였음
 2. 웹취약점 점검 시 홈페이지 접속 중단, 서버 장애로 인한 고객 손실 피해 등
    어떠한 경우에도 한국인터넷진흥원에 민사,형사상 책임을 묻지 않겠음

 3. 한국인터넷진흥원에서 점검한 내용은 증빙자료, 홍보 등의 수단으로 사용하지 않겠음


자세한 사항은 여기에서 전화번호 또는 이메일로 문의하면 답변해 준다.

[컴][웹][자바][스프링] Spring Boot 에서 executable war 사용



Spring Boot 에서 executable war 사용

사용이유

ref. 1 에 따르면 jsp 를 사용하려면 executable jar 로 묶어서는 안되고, .war 로 packaging 을 해야 한다고 한다.

source code

여기서는 gs-spring-boot source 를 사용할 것이다. git clone 을 통해 가져오면 된다. 그런 후에 complete folder 에 있는 소스를 사용하면 된다.
  • git clone https://github.com/spring-guides/gs-spring-boot.git

build.gradle

그래서 build.gradle 에서 bootJar 을 지우고, bootWar 을 적은후 gradlew build 를 하면 된다. 또는 enabled 속성을 이용하면 된다.


만약 2개를 build.gradle 에 적어놓는다면, gradlew bootWar 를 이용하면 된다. 그러면 아래 경로에 만들어진다.
  • <root>\build\libs\broker-sb-0.1.0-SNAPSHOT.war
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'

bootWar {
    // https://docs.gradle.org/current/userguide/war_plugin.html
    enabled = true
    baseName = 'broker-sb'
    version = '0.1.0-SNAPSHOT'
}

bootJar {
    // this determines the jar name.
    enabled = false
    baseName = 'broker-sb'    // ./build/libs/broker-sb-0.1.0.jar
    version =  '0.1.0'
}

webapp directory

아래와 같은 구조로 다음 경로에 webapp 을 만들면 된다.
  • <root>\src\main\webapp\
webapp
   + resources
   + WEB-INF
      + config
      + property
      + tags
      + views

lib에 있는 jar이 .so 등을 필요로 한다면


결과적으로 lib에 같이 넣을 수 없을 듯 하다. 실제로 executable jar / executable war 모두에서 lib 를 읽어드릴때 netsted jar 로 가정하고 읽어드렸다. 그래서 모두 아래와 같은 exception이 발생했다.

c:\a\programming\java\mm\springboot-test\complete\build\libs>java -jar mmbroker-sb-0.1.0-SNAPSHOT.war
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry WEB-INF/lib/libsigar-amd64-linux.so
        at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
        at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
        at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:58)
Caused by: java.io.IOException: Unable to open nested jar file 'WEB-INF/lib/libsigar-amd64-linux.so'
        at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:254)
        at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:239)
        at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
        ... 4 more
Caused by: java.io.IOException: Unable to find ZIP central directory records after reading 65792 bytes
        at org.springframework.boot.loader.jar.CentralDirectoryEndRecord.<init>(CentralDirectoryEndRecord.java:65)
        at org.springframework.boot.loader.jar.CentralDirectoryParser.parse(CentralDirectoryParser.java:52)
        at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:121)
        at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:109)
        at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:287)
        at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:262)
        at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:250)
        ... 6 more

References

  1. Spring Boot Reference Guide > 27.4.5 JSP Limitations

[컴][리눅스] systemd 사용법

sys 사용법 / init 사용법 /


systemd 사용법

commands

  • systemctl : 현재 동작중인 서비스들을 보여준다.
    • systemctl list-unit-files : 등록된 모든 service 들을 보여준다.
    • systemctl list-dependencies mariadb.service : mariadb.service 의 서비스간의 의존관계(dependecy)를 보여준다.
    • systemctl set-default <new_taget_file> : 기본 target 을 변경
    • systemctl get-default : 기본 target 을 알려준다.
    • systemctl isolate runlevel5.target : runlevel5 로 runlevel 을 변경한다.
    • service 실행
      • systemctl start foo.service
      • systemctl stop foo.service
      • systemctl restart foo.service
      • systemctl status foo.service
    • 부팅시 실행
      • systemctl enable foo.service : 부팅시 실행
      • systemctl disable foo.service : 부팅시 실행하지 않도록
  • systemd-analyze : 부팅에 소요된 시간을 알 수 있다.
    • systemd-analyze blame : 각 서비스별 초기화에 걸린 시간을 확인할 수 있다.
    • systemd-analyze plot : init 시간을 그래프로 나타내 준다. output 을 html 로 저장해서 보면 된다.
    • systemd-analyze critical-chain <service_name> : 초기화에 시간을 많이 먹는 서비스들을 보여준다.
  • systemd-cgls
  • systemd-cgtop
  • systemd-loginctl


unit file

기본적으로 /usr/lib/systemd/system 디렉토리에 Unit File 을 보관한다. 보통 .service 의 확장자(?)를 가지고 있다.

만약 기존의 unit file 을 변경하려면, 이 파일을 직접 변경하는 것보단 override 하는 것을 추천한다.[ref.1] (etc/systemd/system/<service>.service)

systemctl edit

systemctl edit mariadb
수정할 수 있다. 자세한 내용은 ref. 1, ref. 4 을 확인하자.

unit file 만들기



target

타겟(Target)은 Sys V 에 Run Level 과 비슷하다. 즉, booting 을 어느 단계까지 할 것이냐를 결정하는 것이라고 보면 된다.

target 도 아래 경로에서 확인할 수 있다.(.target 으로 되어 있다.)

  • /usr/lib/systemd/system/

default target 변경

기본적으로 runlevel*.target(symbolic link 이다.) 이 존재한다. 그래서 이것을 sysv 의 runlevel 처럼 사용하면 된다.


# systemctl set-default runlevel3.target
# systemctl get-default

isolate target

현재 target 을 바꾸고 싶으면 isolate 을 사용하면 된다. (isolate 의 의미)
# systemctl isolate runlevel5.target
예를 들어 만약 gui 를 사용하고 있는데 isolate runlevel3.target 을 하면, gui 를 닫아버리고, runlevel3.target 에 맞추게 된다.

현재 active target 확인

# systemctl list-units --type=target


See Also

  1. 쿠…sal: [컴] systemd 등록 방법

References

  1. CentOS 7 Systemd 이해하기 - Voyager of Linux
  2. 서버 프로세스를 관리하는 올바른 방법 - CODEOK.NET
  3. Useful SystemD commands (hints for systemctl or systemctl vs chkconfig and service)
  4. 10.6. Creating and Modifying systemd Unit Files - Red Hat Customer Portal

[컴][유틸] 리눅스에서 괜찮은 File explorer

파일 익스플로러 / explorer / file explorer 토커 / total commander / totalcmd


linux 에서 괜찮은 file explorer 

  • PCManFM:
    apt-get install pcmanfm


References

  1. https://www.slant.co/topics/5148/~gui-linux-file-managers

[컴][해킹] 해킹 공부 자료

지드라 / 기드라 /

해킹 공부 자료


분류

  • Reversing
  • System
  • Network
  • Web
  • Forensics
  • CTF

System

Buffer Overflow