델파이 Zeos Transaction 사용법과 Transaction Isolation level가 뭔가요??
Zeos컴포넌트에서 트랜잭션 사용법과
또 Transaction Isolation level이 있는데
뭐가 뭔지 모르겠네요 알려주세요
트랜잭션은 간단하게 설명하자면 하나의 논리 단위를 말합니다.
예를 들어 프로그램에서 한명의 유저가 한번의 행동을 했을때를 말하는데
한번의 행동으로 테이블이 2개이상 업데이트가 되었다고 하고
한개를 업데이트하고 두번째 테이블을 업데이트 하기전에 예상치 못한 오류로
중단이 되었으면 나머지 하나 테이블의 업데이트를 못해서 나중에 문제 소지가 될 수 있습니다.
이러한 단점을 보완하기 위해 트랜잭션으로 묶어 일관성을 유지하는 것입니다.
Zeos 트랜잭션 사용하는 방법은
zconnection.autocommit := true;
zconnection.StartTransaction;
try
zquery.sql.clear;
zquery.sql.add(SQL);
zquery.ExecSQL;
zquery.sql.clear;
zquery.sql.add(SQL);
zquery.ExecSQL;
zconnection.commit;
except on E : Exception do
zconnection.rollback;
end;
이렇게만 하면 끝입니다. 하지만 트랜잭션을 사용하기 위해선
zconnection에서 Transaction Isolation level을 설정해야지만 사용할 수 있습니다.
그리고 추가적으로 트랜잭션 레벨에 따른 발생할 수 있는 문제를 말하자면
1. Dirty Reads
수정중인 데이터를 다른 트랜잭션에서도 읽을수 있도록 허용하는 것
2. Nonrepeatable Reads
한트랜잭션 내에서 같은 쿼리를 두번이상 사용할때 그 사이 다른 트랜잭션이 값을 수정또는 삭제하여
두쿼리의 결과가 다른 비일관성이 나타나는 현상
3. Phantoms
한 트랜잭션 안에서 일정범위의 레코드들을 두번 이상 읽을 때 , 첫번재 쿼리에서 없던 레코드가 두번재 쿼리에서 나타나는 현상
트랜잭션 레벨
1. Read Uncommitted커밋되지 않은 데이터를 다른 트랜잭션에서 읽는 것을 허용
Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생
2. Read Committed
Dirty Read 방식 : 트랜잭션이 커밋되어 확정된 데이터만 읽는 것을 허용
대부분의 DBMS의 기본모드
Non-Repeatable Read, Phantom Read 현상은 여전히 발생
3. Repeatable Read선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허
Phantom Read 현상은 여전히 발생
DB2, SQL Server : 읽은 데이터에 걸린 공유 Lock을 커밋할때 까지 유지하는 방식으로 구현
4. Serializable Read선행 트랜잭션이 읽은 자료를 갱신하거나 삭제하지 못할뿐아니라 새로운 레코드 삽입도 금지
좋은 공부되세요^^