2013-09-05 4 views
2

MySQL 데이터베이스에서 두 번 변경된 내용에 대한 스냅 샷을 가져 오려고합니다. 나는 서로 다른 엔티티의 테이블을 가지고 있으며, 각 테이블은 행이 업데이트 될 때 자동으로 현재 날짜로 설정된 "Last Updated"열을 가지고 있습니다.MySQL에서 여러 개의 동시 SELECT 문

"App의 이전 동기화 시간"< = "마지막으로 업데이트 된"< "현재 시스템 (데이터베이스의 각 테이블에 대해 하나씩)을 사용하여 데이터베이스를 쿼리하는 클라이언트 응용 프로그램이 있습니다. 시각". 이것은 정상적으로 작동하고 클라이언트 응용 프로그램을 데이터베이스와 동기화 상태로 유지합니다. 그러나, 테이블 중 일부는 그들 사이의 관계를, 그리고 각 SELECT 문은 데이터베이스에서 동시에 실행되지 않습니다 걱정, 그래서 나는이 같은 끝낼 수 있습니다 그래서

Client App    |   Server App 
SELECT * FROM Table1 | 
         |  Update Table1 & Table2, altering relationships 
SELECT * FROM Table2 | 

테이블 (및 관계)은 스냅 샷을 가져 오는 중간 단계에서 수정되어 잠재적으로 잘못된 관계 정보를 반환합니다 (예 : 서버 응용 프로그램이 테이블 1 & 2에 새 행을 삽입하므로 클라이언트가 테이블 2를 쿼리 할 때 존재하지 않는 표 1의 항목).

나는 트랜잭션이나 잠금을 사용해야한다고 생각하지만, 더 좋은 방법이 있는지 확실하지 않습니다. MySQL Connector/.NET을 사용하여 C#에서 서버에 액세스합니다. 그런 다음

string commandString = "SELECT * FROM Table1; SELECT * FROM Table2;"; 
using (MySqlCommand command = new MySqlCommand(commandString, connection)) 

로 모두 읽어 : 현재, 나는, 예를 들어, 모든 SELECT 문에 하나의 MySQLCommand을 만들 내가 SELECT 문 사이에 수정되는 테이블을 방지 가겠어요 어떻게

using (MySqlDataReader reader = command.ExecuteReader()) 
{ 
    do 
    { 
     if (reader.HasRows) 
     { 
      //.... 
     }   
    } while (reader.NextResult()); 
} 

?

+0

당신이 LOCK을 시도 가지고 일을하고 – SerenityNow

+0

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html을 테이블 잠금을 해제하려면 트랜잭션 이노 엔진을 사용해야합니다 – SerenityNow

+0

그래서 나는 다음과 같이 할 것입니다 : LOCK TABLES Table1 READ, Table2 READ; SELECT * FROM Table1; SELECT * FROM Table2; UNLOCK TABLES; ? 그리고 이것은 다른 연결에서 테이블에 쓰기를 막을 수 있습니까? 잠긴 상태에서 글을 쓰려고하면 어떻게됩니까? 기다릴 지 아니면 오류가 발생합니까? –

답변

0

거래를 사용해야합니다. 클라이언트 앱이 아니라 서버 앱.

begin transaction 
update table1 set .... 
update table2 set .... 
update table2 set .... 
commit 

이렇게하면 table1과 table2가 동시에 커밋되어 클라이언트 응용 프로그램에서 일관된 읽기가 보장됩니다.

참고 :이