동기 데이터베이스 작업 사용

Adobe AIR 1.0 이상

비동기 실행 모드에 대한 코드와 비교할 때, 동기 실행을 사용하는 경우 작업을 실행하고 작업에 응답하는 데 사용하는 실제 코드에는 거의 차이점이 없습니다. 두 방법의 주요 차이점은 두 가지 영역으로 나뉩니다. 첫 번째 영역은 다른 작업에 의존하는 작업(예: SELECT 결과 행 또는 INSERT 문으로 추가된 행의 기본 키)의 실행입니다. 두 번째 영역은 오류 처리입니다.

동기 작업에 대한 코드 작성

동기 실행과 비동기 실행의 주요 차이점은 동기 모드에서는 코드를 단일한 일련의 단계로 작성하는 것입니다. 이와 반대로, 비동기 코드에서는 이벤트 리스너를 등록하고 리스너 메서드 간에 작업을 나누는 경우가 많습니다. 데이터베이스가 동기 실행 모드 에서 연결된 경우 한 코드 블록에서 일련의 데이터베이스 작업을 차례대로 실행할 수 있습니다. 다음 예제에서는 이 방법을 보여 줍니다.

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, OpenMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
// add the customer record to the database 
var insertCustomer:SQLStatement = new SQLStatement(); 
insertCustomer.sqlConnection = conn; 
insertCustomer.text = 
    "INSERT INTO customers (firstName, lastName) " +  
    "VALUES ('Bob', 'Jones')"; 
insertCustomer.execute(); 
     
var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
// add a related phone number record for the customer 
var insertPhoneNumber:SQLStatement = new SQLStatement(); 
insertPhoneNumber.sqlConnection = conn; 
insertPhoneNumber.text =  
    "INSERT INTO customerPhoneNumbers (customerId, number) " +  
    "VALUES (:customerId, '800-555-1234')"; 
insertPhoneNumber.parameters[":customerId"] = customerId; 
insertPhoneNumber.execute(); 
     
// commit the transaction 
conn.commit(); 

보시다시피 동기 실행을 사용하든 비동기 실행을 사용하든 간에 동일한 메서드를 호출하여 데이터베이스 작업을 수행합니다. 두 방법의 주요 차이점은 다른 작업과 오류 처리에 의존하는 작업을 실행하는 것입니다.

다른 작업에 의존하는 작업 실행

동기 실행 모드를 사용하는 경우 작업이 완료될 때를 확인하기 위해 이벤트를 수신하는 코드를 작성할 필요가 없습니다. 대신 한 코드 줄에서 작업이 성공적으로 완료되면 실행이 다음 코드 줄에서 계속된다고 가정할 수 있습니다. 따라서 다른 작업의 성공에 의존하는 작업을 수행하려면 의존하는 작업 바로 뒤에 종속 코드를 작성하기만 하면 됩니다. 예를 들어, 트랜잭션을 시작하고 INSERT 문을 실행하여 삽입된 행의 기본 키를 검색한 후 다른 테이블의 다른 행에 삽입하고 마지막으로 트랜잭션을 커밋하는 응용 프로그램 코드를 작성하려면 일련의 문으로 코드를 모두 작성할 수 있습니다. 다음 예제에서는 이러한 작업을 보여 줍니다.

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, SQLMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
// add the customer record to the database 
var insertCustomer:SQLStatement = new SQLStatement(); 
insertCustomer.sqlConnection = conn; 
insertCustomer.text = 
    "INSERT INTO customers (firstName, lastName) " +  
    "VALUES ('Bob', 'Jones')"; 
insertCustomer.execute(); 
     
var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
// add a related phone number record for the customer 
var insertPhoneNumber:SQLStatement = new SQLStatement(); 
insertPhoneNumber.sqlConnection = conn; 
insertPhoneNumber.text =  
    "INSERT INTO customerPhoneNumbers (customerId, number) " +  
    "VALUES (:customerId, '800-555-1234')"; 
insertPhoneNumber.parameters[":customerId"] = customerId; 
insertPhoneNumber.execute(); 
     
// commit the transaction 
conn.commit(); 

동기 실행에서 오류 처리

동기 실행 모드에서는 작업이 실패했음을 확인하기 위해 오류 이벤트를 수신하지 않습니다. 대신 오류를 트리거할 수 있는 코드를 try..catch..finally 코드 블록의 집합으로 둘러쌉니다. 오류를 발생시키는 코드를 try 블록으로 래핑합니다. 별도의 catch 블록에서 각 오류 유형에 응답하는 작업을 작성합니다. finally 블록에는 성공이나 실패에 관계없이 항상 실행할 코드(예: 더 이상 필요하지 않을 때 데이터베이스 연결을 닫음)를 배치합니다. 다음 예제에서는 오류 처리를 위해 try..catch..finally 블록을 사용하는 방법을 보여 줍니다. 이 예제는 이전 예제에 오류 처리 코드를 추가한 것입니다.

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, SQLMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
try 
{ 
    // add the customer record to the database 
    var insertCustomer:SQLStatement = new SQLStatement(); 
    insertCustomer.sqlConnection = conn; 
    insertCustomer.text = 
        "INSERT INTO customers (firstName, lastName)" +  
        "VALUES ('Bob', 'Jones')"; 
     
    insertCustomer.execute(); 
     
    var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
    // add a related phone number record for the customer 
    var insertPhoneNumber:SQLStatement = new SQLStatement(); 
    insertPhoneNumber.sqlConnection = conn; 
    insertPhoneNumber.text =  
        "INSERT INTO customerPhoneNumbers (customerId, number)" +  
        "VALUES (:customerId, '800-555-1234')"; 
    insertPhoneNumber.parameters[":customerId"] = customerId; 
     
    insertPhoneNumber.execute(); 
     
    // if we've gotten to this point without errors, commit the transaction 
    conn.commit(); 
} 
catch (error:SQLError) 
{ 
    // rollback the transaction 
    conn.rollback(); 
}