문제

저는 훌륭한 VB 프로그래머는 아니지만 Sybase ASE를 백엔드로 사용하는 VB6 데스크톱 응용 프로그램을 유지/향상시키는 임무를 맡고 있습니다. 이 앱에는 약 500 명의 사용자가 있습니다.

최근 에이 응용 프로그램에 기능을 추가하여 데이터베이스의 단일 행으로 추가 삽입/업데이트를 수행하고 키 필드는 트랜잭션 번호이며 필드가 색인화됩니다. 업데이트되는 테이블에는 일반적으로 트랜잭션이 완료되면 레코드가 제거되므로 약 6000 개의 레코드가 있습니다. 배포 후 앱은 사용자가 느린 성능을보고하기 전에 하루 반 동안 잘 작동했습니다.

결국, 우리는 성능 문제를 데이터베이스의 테이블 잠금으로 추적했으며 이전 버전의 앱으로 롤백해야했습니다. 사용 첫날은 월요일에 있었는데, 이는 일반적으로 시스템 사용에 매우 무거운 날이므로 그 날에 문제가 나타나지 않은 이유가 혼란스러워졌습니다.

제자리에 있던 코드에는 Sybase 트랜잭션을 시작하라는 요청이 있습니다. BeginTrans와 CommitTrans 사이의 블록 내에 데이터베이스를 업데이트하는 DLL 파일에 대한 호출이 있습니다. 새 코드를 DLL의 클래스 모듈에 배치했습니다.

단일 삽입/업데이트가 단일 행으로 업데이트되면 왜 그러한 문제가 발생하는지에 대해 혼란스러워합니다. 특히 시스템이 변경되기 전에 정상적으로 작동했기 때문입니다. 여기서 더 큰 문제를 노출시킬 가능성이 있습니까? 아니면 단지 내 접근 방식을 재고해야합니까?

비슷한 상황에 처해 있고 조언을 제공 할 수있는 사람에게 감사의 말을 전합니다.

도움이 되었습니까?

해결책

범인은 BeginTrans 및 CommitTrans 호출의 범위 내에 나타나는 메시지 상자로 밝혀졌습니다. 메시지 상자를 가진 사용자는 메시지를 확인할 때까지 데이터베이스의 차단 잠금을 유지합니다. 해결책은 전술 한 범위 밖에서 메시지 상자를 이동하는 것이 었습니다.

다른 팁

사용중인 SQL 코드없이 완전한 그림을 이해할 수 없습니다.

또한 단일 삽입 또는 업데이트 인 경우 거래를 사용하는 이유는 무엇입니까? 많은 사용자가 같은 행을 업데이트하려고 할 수 있습니까?

VB 코드와 SQL을 모두 게시하면 도움이됩니다 (가능한 경우 쿼리 계획 포함). 그러나 우리가 가진 정보와 함께; 나는 달릴 것이다 update statistics table_name 쿼리 계획이 최신 상태인지 확인하기 위해 표에 대항합니다.

코드가 트랜잭션 내에서 실행되어야한다고 확신한다면 이미 SQL을 사용하지 않고 SQL을 포함하는 자체 트랜잭션 블록을 추가하려고 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top