database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 7114 게시물 읽기
No. 7114
aws rds 의 mssql 동시저장 관련
작성자
재우니(shimpark)
작성일
2018-03-05 17:06:56
조회수
154

 

문의 드려 봅니다.

현재 aws 의 rds 를 사용하고 있으며 mssql 2016을 사용합니다.

제가 저장프로시저를 하나 만들었는데요. 동시에 2명에 같은 시간에 호출한 관계로 각각 저장이 되었고요.

자동증가키는 문제없이 +1 씩 추가 되었는데, 저장프로시저에 특정 구문 중 top 1 해서 +1 한 부분이 둘다 동일한

값이 들어갔습니다.

이 부분에 대해 경험이나 아시는 게 있으면 조언 좀 부탁 드립니다.

 

감사합니다.

이 글에 대한 댓글이 총 1건 있습니다.

대충 아래와 비슷한 프로시저라고 가정하고

 
DECLARE @top1 INT
; -- statement 1
 
SELECT @top1 = MAX( curVal )
FROM aTable
; -- statement 2 / @top1의 값은 10이라 가정
 
INSERT INTO aTable( curVal ) VALUES( @top1 +1 )
; -- statement 3
 
A가 statement 2까지 실행한 상태 즉, @top1 에는 현재의 값인 10이 저장된 상태에서 잠시 실행을 멈추고(잠깐 중단하고 다른 일을 할 수 없다면 A가 무엇인가를 다 실행하기를 기다린 후에야 DB는 다른 일을 할 수 있습니다.)
B가 statement 2까지 실행하면 아직 A가 INSERT해서 MAX(curVal)을 갱신하지 못했으므로, @top1은 역시 10이 됩니다.
그리고는 A, B가 각각 statement 3를 실행하면 11이라는 값이 2개 insert 되게 됩니다.
 
이를 방지하기 위해서 procedure 안에서 isolation level을 설정할 수 있고 이러한 문제를 해결하도록 이 수준을 높이면 병렬성이 떨어져서 성능이 낮아지거나 심각한 경우에는 dead lock이 발생할 수도 있습니다.
 
이러한 내용은 어지간한 SQL 기본서에 설명이 되어 있으므로 가지고 계신 도서를 참조하시거나
그리고 공부하는 김에 뗄레야 뗄 수 없는 https://www.google.co.kr/search?q=t-sql+lock
도 공부하시면 되겠습니다.
 
우욱님이 2018-03-05 19:05:21에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7117필드 분할 문의 드립니다. [1]
mestis
2018-03-16
107
7116postgreSQL 과 MSSQL Linked Server 연결 후 데이터 조회 시 문제
김민재
2018-03-14
113
7115TRUNCATE로 행 삭제> MDF 용량이 그대로네요.. [1]
이재후
2018-03-08
143
7114aws rds 의 mssql 동시저장 관련 [1]
재우니
2018-03-05
154
7113mssql 업그레이드 질문
goblin
2018-03-02
145
7112ROW_NUMBER [2]
크레용
2018-02-20
189
7111when case 질문 [2]
김지철
2018-02-19
186
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2017 DSN, All rights reserved.
작업시간: 0.072초, 이곳 서비스는
	PostgreSQL v10.1로 자료를 관리합니다