SlideShare una empresa de Scribd logo
1 de 10
Descargar para leer sin conexión
WareValley
http://www.WareValley.com
Database Audit and Protection [ DB 접근통제 ]
Database Encryption [ DB 암호화 ]
Database Vulnerability Assessment [ DB 취약점 분석 ]
Database SQL Query Approval [ DB 작업결재 ]
Database Performance Monitoring and Management [ DB 성능관리 및 개발 ]
WareValley
Oracle Transaction
Ways of Concurrency Control
오렌지팀 윤석준 선임연구원
Database security and management, WareValley.
http://www.WareValley.com
Concurrency Control
비관적 동시성 제어
(Pessimistic Concurrency Control)
• 같은 Data를 동시에 수정할 것이라고 가
정
• Data를 읽는 시점에 Lock을 걸고 처리가
완료될 때까지 유지
• 동시성이 많이 떨어짐
(많이 떨어짐 ? 거의 없다고 봐야…)
낙관적 동시성 제어
(Optimistic Concurrency Control)
• 같은 Data를 동시에 수정하지 않을 것이
라고 가정
• Data를 읽을 때는 Lock을 걸지 않고,
대신 Update 시점에 앞서 읽은 Data가
변경되었는지 확인해야 함
• Lock이 유지되는 시점이 매우 짧아
동시성 확보에 유리
-> 하지만…. 귀찮 귀찮
-> 그래서 실상은 동시성 제어 없는
낙관적 프로그래밍이 대부분
Database security and management, WareValley.
http://www.WareValley.com
e.g. Concurrency Control
Senario SQL
SELECT itemCode, itemPrice
INTO :Code , :Price
WHERE items;
INSERT INTO orders
SELECT :Code, :custId, :orderDate, :shopId,
FROM items
WHERE itemCode = :Code
AND itemPrice = :Price;
IF sql%rowcount = 0 then
ALERT('상품 가격이 변경되었습니다.');
END if;
• 온라인 쇼핑몰에서 1,000원짜리 바나나를
주문
• 주문이 진행되는 동안 바나나 가격이
1,200원으로 수정됨
• 최종 결제 버튼을 클릭하는 순간
변경 여부를 체크하여,
변경되었으면 사용자에게 통보
Database security and management, WareValley.
http://www.WareValley.com
Pessimistic Concurrency Control
Senario SQL
적립 포인트 추가
( 끝 ! 다른 설명이 필요 ? )
SELECT point, visitCnt,
lastVisitedDate, amtBuy
FROM cust
WHERE id = :cust_num FOR UPDATE;
-- 적립 Point 계산
UPDATE cust
SET point = :newPoint
WHERE id = :cust_num;
잘못된 변경은 막을 수 있지만,
다른 Transaction 에서 Lock 을 걸어두고 하루 종일 있으면…
사용자 입장에서 하루 종일 기다릴 수도…
시스템 다운됬다고 생각할 수도…
Database security and management, WareValley.
http://www.WareValley.com
FOR UPDATE options
 FOR UPDATE NOWAIT
- 대기없이 Exception ( ORA-00054 )
 FOR UPDATE WAIT 3
- 3초 대기 후 Exception ( ORA-30006 )
Database security and management, WareValley.
http://www.WareValley.com
Optimistic Concurrency Control #1
Senario SQL
적립 포인트 추가
( OK ? )
SELECT point, visitCnt, last_dt, amtBuy
INTO :a, :b, :c, :d
FROM cust
WHERE id = :cust_num;
-- 적립 Point 계산
UPDATE cust
SET point = :newPoint
WHERE id = :cust_num
AND point = :a
AND visitCnt = :b
AND last_dt = :c
AND amtBuy = :d;
IF sql%rowcount = 0 then
ALERT('다른 사용자에 의해 변경되었습니다.');
END if;
 변수이름 붙이는 것도 귀찮…
(만약 column이 4개가 아니라 20개라면…)
=> 그냥 최종변경일 하나 Check 하고 끝내자.
OK ?
Database security and management, WareValley.
http://www.WareValley.com
Optimistic Concurrency Control #2
SQL
SELECT point, visitCnt, last_dt, amtBuy, mod_dt
INTO :a, :b, :c, :d, :mod_dt
FROM cust
WHERE id = :cust_num;
-- 적립 Point 계산
UPDATE cust
SET point = :newPoint
WHERE id = :cust_num
AND mod_dt = :mod_dt;
IF sql%rowcount = 0 then
ALERT('다른 사용자에 의해 변경되었습니다.');
END if;
 이제 Column 하나만 비교 하면 끝
 하지만, 프로그램 상에서가 아니라
직접 SQL로 UPDATE 하면서
mod_dt 를 변경하지 않으면…
Database security and management, WareValley.
http://www.WareValley.com
Optimistic Concurrency Control #3
SQL
SELECT point, visitCnt, last_dt, amtBuy, mod_dt
INTO :a, :b, :c, :d, :mod_dt
FROM cust
WHERE id = :cust_num;
-- 적립 Point 계산
SELECT id
FROM cust
WHERE id = :cust_num;
AND mod_dt = :mod_dt FOR UPDATE;
UPDATE cust
SET point = :newPoint
WHERE id = :cust_num
 UPDATE 바로 전에
FOR UPDATE 로 SELECT 한방
Database security and management, WareValley.
http://www.WareValley.com
Optimistic Concurrency Control #4
SQL
SELECT point, visitCnt, last_dt, amtBuy, ora_rowscn
INTO :a, :b, :c, :d, :scn
FROM cust_R
WHERE id = :cust_num;
-- 적립 Point 계산
UPDATE cust
SET point = :newPoint
WHERE id = :cust_num
AND rowscn = :scn;
IF sql%rowcount = 0 then
ALERT('다른 사용자에 의해 변경되었습니다.');
END if;
 Row 단위로 SCN 등록하도록 변경
(기본값은 NoRowDepencencies 로
Block의 SCN 값이 ora_rowscn이 됨)
 프로그램이 아닌 직접 SQL문으로
Data 수정했을 경우에도 적용됨
 하지만 11gR2 (11.2.0.1) 에도
Bug 7338384 가 있어서
사용할 수 없다.
=> 2 개의 Transaction에서 동시에
UPDATE했을 경우 Lost Update 발생
CREATE TABLE cust_R
RowDependencies
AS
SELECT * FROM cust;
Database security and management, WareValley.
http://www.WareValley.com
ORA_ROWSCN
RowDependenciesNoRowDependencies
SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP_R;SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP;
UPDATE SCOTT.EMP
SET SAL = SAL + 20
WHERE EMPNO = 7369;
UPDATE SCOTT.EMP_R
SET SAL = SAL + 20
WHERE EMPNO = 7369;
SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP_R;SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP;

Más contenido relacionado

Destacado

제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
EXEM
 
7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트
Young-Ho Cha
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
KTH
 

Destacado (15)

MariaDB Optimization
MariaDB OptimizationMariaDB Optimization
MariaDB Optimization
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
 
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트
 
간단한 쉘 스크립트 작성하기
간단한 쉘 스크립트 작성하기간단한 쉘 스크립트 작성하기
간단한 쉘 스크립트 작성하기
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
 
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
 
개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝
 
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
 
MySQL 기초
MySQL 기초MySQL 기초
MySQL 기초
 
성능 좋은 SQL 작성법
성능 좋은 SQL 작성법성능 좋은 SQL 작성법
성능 좋은 SQL 작성법
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표
IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표
IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표
 
[오픈소스컨설팅]MySQL Monitoring
[오픈소스컨설팅]MySQL Monitoring[오픈소스컨설팅]MySQL Monitoring
[오픈소스컨설팅]MySQL Monitoring
 

Similar a [2015-05-22] Oracle Ways of Concurrency Control

AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018
AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018
AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018
Amazon Web Services Korea
 

Similar a [2015-05-22] Oracle Ways of Concurrency Control (20)

CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingCloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
CloudWatch 성능 모니터링과 신속한 대응을 위한 노하우 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
 
ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
 
WiseMon 제품소개서
WiseMon 제품소개서WiseMon 제품소개서
WiseMon 제품소개서
 
AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018
AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018
AWS Support에서 제안하는 멋진 클라우드 아키텍처 디자인::조성열:: AWS Summit Seoul 2018
 
Prometheus Project Journey
Prometheus Project JourneyPrometheus Project Journey
Prometheus Project Journey
 
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive [2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
[2017 AWS Startup Day] AWS 비용 최대 90% 절감하기: 스팟 인스턴스 Deep-Dive
 
Sencha ExtJS를 활용한 물류 통합 관리솔루션 개발 사례
Sencha ExtJS를 활용한 물류 통합 관리솔루션 개발 사례Sencha ExtJS를 활용한 물류 통합 관리솔루션 개발 사례
Sencha ExtJS를 활용한 물류 통합 관리솔루션 개발 사례
 
분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용
분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용
분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
Accelerate spring boot application with apache ignite
Accelerate spring boot application with apache igniteAccelerate spring boot application with apache ignite
Accelerate spring boot application with apache ignite
 
Flux 예제 분석 2
Flux 예제 분석 2Flux 예제 분석 2
Flux 예제 분석 2
 
DB2 authorization & priviliege
DB2 authorization & priviliegeDB2 authorization & priviliege
DB2 authorization & priviliege
 
Monitoring System Targeting OpenStack, Baremetal, and Network Fabric
Monitoring System Targeting OpenStack, Baremetal, and Network FabricMonitoring System Targeting OpenStack, Baremetal, and Network Fabric
Monitoring System Targeting OpenStack, Baremetal, and Network Fabric
 
Online service 계층별 성능 모니터링 방안
Online service 계층별 성능 모니터링 방안Online service 계층별 성능 모니터링 방안
Online service 계층별 성능 모니터링 방안
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
Redis
RedisRedis
Redis
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 

Más de Seok-joon Yun

Más de Seok-joon Yun (20)

Retrospective.2020 03
Retrospective.2020 03Retrospective.2020 03
Retrospective.2020 03
 
Sprint & Jira
Sprint & JiraSprint & Jira
Sprint & Jira
 
Eks.introduce.v2
Eks.introduce.v2Eks.introduce.v2
Eks.introduce.v2
 
Eks.introduce
Eks.introduceEks.introduce
Eks.introduce
 
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image ConverterAWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
 
아파트 시세,어쩌다 머신러닝까지
아파트 시세,어쩌다 머신러닝까지아파트 시세,어쩌다 머신러닝까지
아파트 시세,어쩌다 머신러닝까지
 
Pro typescript.ch07.Exception, Memory, Performance
Pro typescript.ch07.Exception, Memory, PerformancePro typescript.ch07.Exception, Memory, Performance
Pro typescript.ch07.Exception, Memory, Performance
 
Doing math with python.ch07
Doing math with python.ch07Doing math with python.ch07
Doing math with python.ch07
 
Doing math with python.ch06
Doing math with python.ch06Doing math with python.ch06
Doing math with python.ch06
 
Doing math with python.ch05
Doing math with python.ch05Doing math with python.ch05
Doing math with python.ch05
 
Doing math with python.ch04
Doing math with python.ch04Doing math with python.ch04
Doing math with python.ch04
 
Doing math with python.ch03
Doing math with python.ch03Doing math with python.ch03
Doing math with python.ch03
 
Doing mathwithpython.ch02
Doing mathwithpython.ch02Doing mathwithpython.ch02
Doing mathwithpython.ch02
 
Doing math with python.ch01
Doing math with python.ch01Doing math with python.ch01
Doing math with python.ch01
 
Pro typescript.ch03.Object Orientation in TypeScript
Pro typescript.ch03.Object Orientation in TypeScriptPro typescript.ch03.Object Orientation in TypeScript
Pro typescript.ch03.Object Orientation in TypeScript
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threads
 
Welcome to Modern C++
Welcome to Modern C++Welcome to Modern C++
Welcome to Modern C++
 
[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2
 
오렌지6.0 교육자료
오렌지6.0 교육자료오렌지6.0 교육자료
오렌지6.0 교육자료
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
 

[2015-05-22] Oracle Ways of Concurrency Control

  • 1. WareValley http://www.WareValley.com Database Audit and Protection [ DB 접근통제 ] Database Encryption [ DB 암호화 ] Database Vulnerability Assessment [ DB 취약점 분석 ] Database SQL Query Approval [ DB 작업결재 ] Database Performance Monitoring and Management [ DB 성능관리 및 개발 ] WareValley Oracle Transaction Ways of Concurrency Control 오렌지팀 윤석준 선임연구원
  • 2. Database security and management, WareValley. http://www.WareValley.com Concurrency Control 비관적 동시성 제어 (Pessimistic Concurrency Control) • 같은 Data를 동시에 수정할 것이라고 가 정 • Data를 읽는 시점에 Lock을 걸고 처리가 완료될 때까지 유지 • 동시성이 많이 떨어짐 (많이 떨어짐 ? 거의 없다고 봐야…) 낙관적 동시성 제어 (Optimistic Concurrency Control) • 같은 Data를 동시에 수정하지 않을 것이 라고 가정 • Data를 읽을 때는 Lock을 걸지 않고, 대신 Update 시점에 앞서 읽은 Data가 변경되었는지 확인해야 함 • Lock이 유지되는 시점이 매우 짧아 동시성 확보에 유리 -> 하지만…. 귀찮 귀찮 -> 그래서 실상은 동시성 제어 없는 낙관적 프로그래밍이 대부분
  • 3. Database security and management, WareValley. http://www.WareValley.com e.g. Concurrency Control Senario SQL SELECT itemCode, itemPrice INTO :Code , :Price WHERE items; INSERT INTO orders SELECT :Code, :custId, :orderDate, :shopId, FROM items WHERE itemCode = :Code AND itemPrice = :Price; IF sql%rowcount = 0 then ALERT('상품 가격이 변경되었습니다.'); END if; • 온라인 쇼핑몰에서 1,000원짜리 바나나를 주문 • 주문이 진행되는 동안 바나나 가격이 1,200원으로 수정됨 • 최종 결제 버튼을 클릭하는 순간 변경 여부를 체크하여, 변경되었으면 사용자에게 통보
  • 4. Database security and management, WareValley. http://www.WareValley.com Pessimistic Concurrency Control Senario SQL 적립 포인트 추가 ( 끝 ! 다른 설명이 필요 ? ) SELECT point, visitCnt, lastVisitedDate, amtBuy FROM cust WHERE id = :cust_num FOR UPDATE; -- 적립 Point 계산 UPDATE cust SET point = :newPoint WHERE id = :cust_num; 잘못된 변경은 막을 수 있지만, 다른 Transaction 에서 Lock 을 걸어두고 하루 종일 있으면… 사용자 입장에서 하루 종일 기다릴 수도… 시스템 다운됬다고 생각할 수도…
  • 5. Database security and management, WareValley. http://www.WareValley.com FOR UPDATE options  FOR UPDATE NOWAIT - 대기없이 Exception ( ORA-00054 )  FOR UPDATE WAIT 3 - 3초 대기 후 Exception ( ORA-30006 )
  • 6. Database security and management, WareValley. http://www.WareValley.com Optimistic Concurrency Control #1 Senario SQL 적립 포인트 추가 ( OK ? ) SELECT point, visitCnt, last_dt, amtBuy INTO :a, :b, :c, :d FROM cust WHERE id = :cust_num; -- 적립 Point 계산 UPDATE cust SET point = :newPoint WHERE id = :cust_num AND point = :a AND visitCnt = :b AND last_dt = :c AND amtBuy = :d; IF sql%rowcount = 0 then ALERT('다른 사용자에 의해 변경되었습니다.'); END if;  변수이름 붙이는 것도 귀찮… (만약 column이 4개가 아니라 20개라면…) => 그냥 최종변경일 하나 Check 하고 끝내자. OK ?
  • 7. Database security and management, WareValley. http://www.WareValley.com Optimistic Concurrency Control #2 SQL SELECT point, visitCnt, last_dt, amtBuy, mod_dt INTO :a, :b, :c, :d, :mod_dt FROM cust WHERE id = :cust_num; -- 적립 Point 계산 UPDATE cust SET point = :newPoint WHERE id = :cust_num AND mod_dt = :mod_dt; IF sql%rowcount = 0 then ALERT('다른 사용자에 의해 변경되었습니다.'); END if;  이제 Column 하나만 비교 하면 끝  하지만, 프로그램 상에서가 아니라 직접 SQL로 UPDATE 하면서 mod_dt 를 변경하지 않으면…
  • 8. Database security and management, WareValley. http://www.WareValley.com Optimistic Concurrency Control #3 SQL SELECT point, visitCnt, last_dt, amtBuy, mod_dt INTO :a, :b, :c, :d, :mod_dt FROM cust WHERE id = :cust_num; -- 적립 Point 계산 SELECT id FROM cust WHERE id = :cust_num; AND mod_dt = :mod_dt FOR UPDATE; UPDATE cust SET point = :newPoint WHERE id = :cust_num  UPDATE 바로 전에 FOR UPDATE 로 SELECT 한방
  • 9. Database security and management, WareValley. http://www.WareValley.com Optimistic Concurrency Control #4 SQL SELECT point, visitCnt, last_dt, amtBuy, ora_rowscn INTO :a, :b, :c, :d, :scn FROM cust_R WHERE id = :cust_num; -- 적립 Point 계산 UPDATE cust SET point = :newPoint WHERE id = :cust_num AND rowscn = :scn; IF sql%rowcount = 0 then ALERT('다른 사용자에 의해 변경되었습니다.'); END if;  Row 단위로 SCN 등록하도록 변경 (기본값은 NoRowDepencencies 로 Block의 SCN 값이 ora_rowscn이 됨)  프로그램이 아닌 직접 SQL문으로 Data 수정했을 경우에도 적용됨  하지만 11gR2 (11.2.0.1) 에도 Bug 7338384 가 있어서 사용할 수 없다. => 2 개의 Transaction에서 동시에 UPDATE했을 경우 Lost Update 발생 CREATE TABLE cust_R RowDependencies AS SELECT * FROM cust;
  • 10. Database security and management, WareValley. http://www.WareValley.com ORA_ROWSCN RowDependenciesNoRowDependencies SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP_R;SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP; UPDATE SCOTT.EMP SET SAL = SAL + 20 WHERE EMPNO = 7369; UPDATE SCOTT.EMP_R SET SAL = SAL + 20 WHERE EMPNO = 7369; SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP_R;SELECT EMPNO, SAL, ORA_ROWSCN FROM SCOTT.EMP;