2017-09-05 2 views
0

내가 (SQL이 효과를 손질 만이 별도의 문이 필요)COMMIT을 얼마나 자주/

Dim mydb   As DAO.Database 
Dim myq    As DAO.QueryDef 

Set mydb = DBEngine.Workspaces(0).Databases(0) 
Set myq = mydb.CreateQueryDef("") 

With myq 
    .SQL = "INSERT INTO tbltrailnew..." 
    .Execute 'Execute SQL 
    .SQL = "Commit" 'Commit changes to database 
    .Execute 'Execute SQL 
    .SQL = "INSERT INTO tbltrailnew..." 
    .Execute 'Execute SQL 
    .SQL = "Commit" 'Commit changes to database 
    .Execute 'Execute SQL 
    .Close 'Close connection 
End With 
Oracle 테이블에 삽입 할 액세스/VBA에서 다음 코드를 실행 해요 액세스 VBA를 통해 오라클에 EXECUTE

오라클에 익숙하지 않기 때문에 제 질문은 - 불필요한 횟수의 실행과 커밋입니까? 그렇다면 어떻게 내 코드를 제거 할 수 있습니까?

+0

올바르게 작성했는지 여부는 응용 프로그램 설계 방법에 달려 있습니다. 데이터베이스 트랜잭션/논리적 작업 단위에 대한 내용은 응용 프로그램이 무엇이든 적용 할 수있는 원칙을 제공합니다. – BriteSponge

답변

1

, 여기에 내 걸릴 수 있습니다 : 당신은 본질적으로 하나 개의 연결 작업을 수행 할 때

예, 한 번만 커밋 할 수 있으며, 일반적으로, 그것은 여러 번 짓는 것보다 낫다.

커밋한다는 것은 : 방금 한 모든 작업이 데이터베이스에 영구적으로 기록되었는지 확인하십시오. 위의 게시자가 중간에 오류가 발생하여 이미 일부 삽입을 커밋 한 경우 해당 하위를 다시 실행할 수 없으며 다른 사람이 두 번 커밋 한 경우입니다.

하위 작업이 끝나면 커밋하는 경우 실행 중 오류가 발생하면 다시 실행할 수 있습니다.

첫 번째 커밋을 제거하면 바꿀 수 있습니다.

0

사실 오라클 관련 질문이 아닙니다. 그것은 모두 귀하의 데이터와 관련이 있습니다. 삽입물 중 하나라도 실패 할 경우 어떻게해야합니까? 다른 인서트를 수행해야합니까? 롤백해야합니까/다른 삽입 작업을 수행하지 않아야합니까?

데이터베이스를 일관된 상태로 유지할 솔루션을 선택하십시오. @StephaneM이 점을 가지고 있지만

1

일반적으로 모든 트랜잭션이 끝나면 커밋해야합니다. 그것은 하나의 테이블에 두 개의 삽입이 두 개의 트랜잭션이되어야한다는 것을 여러분의 예제에서 보지 않으므로 끝에 하나의 커밋 만 있어야합니다.

트랜잭션을 정의해야하는 간단한 비유는 ATM 재 회수입니다. 각 단추 누르기는 현금 인출 시점까지, 하나의 거래를 구성합니다. 현금을 받으면 COMMIT를 받게됩니다. 현금을받지 못하면 롤백이됩니다. 각 단추 누르기는 거래가 될 수 없습니다. 그렇지 않으면 돈을 요구할 시점에 커밋하고 현금을받지 못합니다.

과도한 커밋은 오라클이 트랜잭션을 디스크에 기록하기 위해 백그라운드에서 많은 작업을해야하기 때문에 문제를 일으킬 수 있습니다. 데이터로드와 같이 행에 많은 수의 삽입이있는 경우 일반적으로 약 5000에서 10000까지 커밋합니다. 많은 수의 삭제에 대해 동일합니다.

서버와 클라이언트 간의 왕복을 최소화하기 위해 BULK COLLECT 및 FORALL/INSERT를 사용하는 방법을 연구 할 수도 있습니다. 이는 대량의 DML (삽입/업데이트/삭제)을 수행 할 계획 인 경우에만 해당됩니다.

관련 문제