2. 컴퓨터 이야기/프로그래밍

오라클 DB 의 Lock 을 염두에 둔, 레코드 업데이트

래빗 크리스 2009. 7. 17. 14:12

하나 이상의 프로세스를 통하여 동일 레코드의 특정 칼럼 값(들)을 수정하는 경우,
어떤 것이 적용될까..?
순식간에 발생하더라도 마지막에 update 가 수행된 하나만 반영이 될터인데..
그러면, 반영되기는 했지만 최종적으로는 적용되지 않은 쪽이 억울하지 않을까..?
해당 레코드가 여러번 수정되어도 마지막에 수정된 내용만 남게 되기도 하고..

이를 방지하기 위해서, 검린 님이 2가지 방법을 기술하였는데..

하나는, 칼럼(columnA)을 하나 추가해서 마지막에 수정한 일시(timestamp)를 가지게 하고,
동일 레코드를 읽을때 추가된 칼럼 columnA 값을 읽어서 가지고 있다가,
update 문의 조건절에 최종 수정일시 columnA 를 조건으로 추가하면 된다는 것.
A 와 B 가 언제든 해당 레코드를 select 로 읽었을 때의 값은 columnA 값으로 동일할 것이고,
update 문에 동일한 값을 넣었을때 이미 columnA 값이 변경되었다면,
첫번째 이후로 update 한 문장은 update 가 이루어지지 않게 된다는 것.
그런데, 이렇게 되면.. 두번째 부터 저장하려고 하는 넘들은 억울할테니까..
억울해 하지 않도록 프로그램 단에서 잘 처리해 주어야 한다는 것.
아무튼, DB 상에서는 처음 저장한 넘이 장땡.. 크윽.

그런데, 수행 속도는 떨어지더라도.. 을 유지하게 된다면 원인을 알아낼 수 있지 않나 싶어요.
그러니까, tableA 의 내용을 백업할 수 있는 tableA' 를 만들어서..
tableA 에 데이타를 넣을때 insert into tableA' ~ select ~ from tableA where ~ 로 일일이 백업을 해 둔다는 거죠.
트랜잭션 부하가 관건인 곳에서는 글쎄... 사용하기 뭐 하지만서도..
데이타 자체가 중요한 곳에서는 퍼포먼스에 영향을 준다고 빼먹어 버리면 곤란하다 싶습니다.

두번째 방법은 10g 이상에서 scn 값을 읽었다가 첫번째 방법과 동일하게 사용한다는 것.
칼럼은 추가하지 않아도 되겠지만, 10g 이상이어야 한다는 것이 문제네요.
10g 하위 버전에서는 첫번째 방법을 사용하라는 야그..

이 외에도 insert 문에서의 동시성 해결 방법, Dealock 방지 방법들도 기술되어 있습니다.
간혹 왜 오류가 발생했는지 모르겠다는 말들이 나오는데, 검린 님의 글을 읽다 보면 그 이유를 짚을 수 있을거에요.
암튼, 한번 읽어 봤는데.. 아직 뭔 이야기인지 모를 부분이 남아 있네요.. 머리좀 헹구고 다시 몇번 읽어 봐야 겠어요. .ㅠㅠ

검린 님의 포스트
http://blog.naver.com/mirnae?Redirect=Log&logNo=100072240686