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 7003 게시물 읽기
No. 7003
IF NOT EXISTS (...) INSERT ... ELSE UPDATE ... 구문에도 트랜잭션을 써야하나요?
작성자
iruis
작성일
2016-09-01 13:52ⓒ
2016-09-01 14:00ⓜ
조회수
3,150

코드를 넘겨받은 프로그램이 있는데...

ADDR 필드값에 대한 데이터가 중복되어 입력되지않고 업데이트되어야 하는데 중복데이터가 입력됩니다.
스래드가 여러개 돌아가긴하지만 스래드당 테이블이 하나라서 문제가 없어야할거로 생각되는데 자꾸 데이터가 늘어납니다.

쿼리는 아래와같습니다.

IF NOT EXISTS (SELECT [TIMESTAMP] FROM [T] WHERE [ADDR] = 9889)
BEGIN
INSERT INTO [T] (ADDR], [VALUE], [TIMESTAMP]) VALUES (9889, 1.0, GETDATE());
END
ELSE
BEGIN
UPDATE [T] SET [VALUE] = 1.0, [TIMESTAMP] = GETDATE() WHERE [ADDR] = 9889;
END


필드 몇개 빼고 임의로 이름을 정리한 쿼리입니다.

문제는 ADDR 필드의 값에대한 데이터가 있으면 UPDATE, 없다면 INSERT를 하도록하는데 며칠 지나고보면 대부분의 서버에서는 항상 9889값을 가지는 데이터 레코드가 하나둘 늘어나서 함께 UPDATE되고있습니다.

분명 테이블 하나에대한 스래드는 하나뿐인데... 프로그램이 어딘가 문제있어서 같은 테이블에 저 쿼리가 한번에 여러 스래드에서 쿼리를 사용하게되는걸까요?
아니면 저 쿼리에서도 트랜잭션을 써야하는지 궁금합니다.

Qt의 SQL 플러그인이 ODBC를 통해서 MS SQL을 지원하던데 설마 ODBC문제일까요?

감사합니다.

[Top]
No.
제목
작성자
작성일
조회
7007full-text-search 결과 이상. [2]
버거버그
2016-09-11
4093
7005시간대별 통계 질문 입니다. [2]
Hanzel
2016-09-02
3191
7004월별 가로 출력 ms-sql 쿼리 질문입니다. 내공100 [1]
김민용
2016-09-01
3189
7003IF NOT EXISTS (...) INSERT ... ELSE UPDATE ... 구문에도 트랜잭션을 써야하나요?
iruis
2016-09-01
3150
7002SQL200-> SQL2008R2 마이그래션 방법
김미애
2016-08-31
2966
7001MS-SQL 간의 테이블 복사
윤병호
2016-08-31
3115
7000UPDATE 문 오류 UPDATE is not updatable [1]
궁금이
2016-08-18
2768
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v14.2로 자료를 관리합니다