2012-09-12 3 views
0

저는 레거시 as400 시스템의 일부 정보를 새 SQL Server 2008 설치로 이동하는 Java 프로세스 작성 업무를 담당했습니다. 정보는 as400 시스템에서 관리되기 때문에 "온 디맨드 (on-demand)"솔루션이 필요합니다 (IE 사용자가 하루에 한 두 차례 킥오프하고 SQL Server에 최신 버전의 데이터를 채워야합니다). 꽤 많이 사용되는 데이터 세트이므로 테이블을 지우고 다시 작성하는 트랜잭션을 사용하는 것이 좋습니다. 트랜잭션은 내 프로세스를 통해 데이터를 요청하여 실수로 불완전한 목록을 가져 오는 것을 방지해야합니다. 이런 상황을 관리하는 올바른 방법일까요? 필요한 경우트랜잭션 기반 테이블 편집

또한 설명 :

내가 팀에 새로운 개발자의 하나는 훨씬 더 수석 개발자 중 하나 우리는 "메모리 교체"프로세스를 수행 주장하려고 해요. 그는 두 테이블에있는 모든 레코드를 업데이트하고 존재하지 않는 새 레코드를 삽입 한 다음 더 이상 존재하지 않는 레코드를 삭제하려고합니다. 나는 이것이 좋은 생각이라고 확신하지 못한다. 특히 프로세스의 중간에 요청이 돌아 오면 데이터가 엉망이되기 때문이다. 나는 단지 기술적 인 관점에서 얼마나 강력하게 복귀해야 하는지를 알고 싶다.

+0

* 프로세스 중반에 요청하면 데이터 *가 표시됩니다. 로드 프로세스를 트랜잭션에 넣는 경우가 아니라면 –

+0

조금 더 설명 할 수 있습니까? – thedan

+0

Java에 대해서는 잘 모르지만 데이터 액세스 라이브러리를 사용하면 단일 트랜잭션 내에서 여러 DML 문을 실행할 수 있습니다. 트랜잭션 중에 커밋되지 않은 변경 사항을 볼 수있는 다른 요청은 일반적으로 허용되지 않습니다. JDBC 예제는 [트랜잭션 사용] (http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html)을 참조하십시오. –

답변

1

채우는 데 걸리는 시간에 따라 테이블이 잠겨서 액세스 할 수없는 경우 사용자 관점에서 적절한 성능을 얻지 못할 수 있습니다.

시도해보십시오 (하위 테이블이 없다고 가정). 같은 구조의 두 테이블을 만듭니다. table1의 모든 열을 selact하는보기를 작성하십시오. 프로세스에 table2를 채우십시오. 완료되면보기를 table2를 참조하도록 변경하십시오 (초 또는 밀리 초가 걸림). 모든 응용 프로그램 코드에서 기본 테이블 대신보기를 참조하게하십시오. 이렇게하면 대규모 테이블을 빌드하고 인덱스를 다시 작성할 수 있으며 사용자는 관점을 재구성하는 데 걸리는 시간 만 지연되므로 사용자는이를 알지 못합니다. 테이블을 재생성하는 데 몇 분 또는 몇 시간이 걸릴 수도 있습니다. 물론 다음 번에 역순으로 테이블 하나를 채운 다음 뷰를 다시 바꿀 것입니다.

+0

실제로 나쁜 생각은 아닙니다. 나는 이것이 얼마나 많은 일을해야하는지 알게 될 것이다. 나는 우리가 그것을 정당화 할만 큼 충분한 데이터를 가지고 있는지 확신하지 못한다. (최대 2K 행 이하) – thedan

+0

즉석에서보기를 정의하는 것과 비슷한 방식으로보기의 정의를 변경하고 있습니까? [This was cautioned] (http://stackoverflow.com/a/1044210/119477)에 대한. 진지하게도 거래가 진행 중이고 조회수가 바뀌면 어떻게 될지 전혀 알지 못합니까? –

+0

이는 사용자가 제어하는 ​​가져 오기를 통해서만 채워지는보기를 변경할 때 해당 테이블과의 트랜잭션이없는 테이블을위한 것입니다. 다른 사용자는 테이블을 변경해야합니다. – HLGEM