2009-06-14 6 views
0

lock(), unlock(), query1(), query2() 및 query3() 함수가 있습니다. 쿼리 함수는 데이터베이스에서 일부 쿼리를 실행하고 r/w 액세스로 간주 할 수 있습니다. 그들은 잠그지 않는다. 내 시스템이 멀티 스레드입니다.데이터베이스 트랜잭션 및 스레드

원하는 기능은 다음과 같습니다. 스레드 p1에서 lock()이 호출되면 스레드 p1의 쿼리 만 실행되고 다른 모든 스레드의 쿼리는 잠금 해제를 기다립니다. 어떻게해야합니까?

저는 C에서 pthreads를 사용하고 있습니다. 이렇게하려면 스레드가 잠금을 보유하고 있음을 알아야합니다. 그러나 pthread에는 그러한 기능이 없습니다.

디자인이 잘못 되었습니까 ??

편집이 :

Function1(){ 
lock(); 
query1(); 
query2(); 
doQuery3(); 
unlock(); 
} 

doQuery3(){ 
lock(); 
query3(); 
unlock(); 
} 

잠금 내가 원하는 동작() 스레드가 이미 잠금을 보유하는 경우는 잠금을 기다릴해야한다는 것입니다. 그냥 실행해야합니다. 사실, lock() 함수는 실제로 트랜잭션을 시작합니다. 거래에서 여러 가지 물건을 실행하고 싶습니다. 그리고 unlock()은 트랜잭션을 종료합니다. 나는 질의를 연결할 수 있기를 원한다. 한 가지 해결 방법은 function1()에서 query3()을 doQuery3() 대신 호출하는 것입니다. 즉, 모든 함수에는 잠금 및 바닐라 쿼리가있는 두 가지 버전이 있습니다.

이 잠금 및 잠금 해제 함수는 뮤텍스 잠금이 아니거나 뮤텍스 잠금이 아닐 수도 있습니다. pthread 뮤텍스로 구현하려고 시도했지만 할 수 없습니다. 동일한 스레드에서 pthread_mutex_lock이 차단되기 때문에! 어떤 멋진 트릭 ??

+0

더 잘 구현하는 방법을 알려면 더 많은 정보가 필요합니다. 이 잠금 전략으로 무엇을 달성하려고합니까? – Schwern

+0

당신이 PTHREAD_MUTEX_RECURSIVE를 쓰면 스레드가 같은 잠금을 두 번 이상 획득 할 수 있다고 생각합니다. – ChrisW

답변

1

...

내가 원하는 기능은 다음과 같습니다 잠금() 스레드 (P1)에서 호출되는 경우에만 스레드 (P1)에서 쿼리 것 실행하고 다른 모든 스레드의 쿼리는 잠금 해제를 기다립니다. 어떻게해야합니까?

P1에는 스레드에 의해 호출 작업 단위가 같은 경우

...

void doQuery1() 
{ 
    //get the lock 
    //if someone else has the lock, block until it's released 
    lock(); 

    //now we have the lock 
    //do query 
    query1(); 

    //our work is done 
    //release the lock, let another thread run 
    unlock(); 
} 

... 그리고 스레드가 유사하다 다른 사람에 의해 호출 작업 ...

void doQuery2() 
{ 
    lock(); 
    query2(); 
    unlock(); 
} 

void doQuery3() 
{ 
    lock(); 
    query3(); 
    unlock(); 
} 

... 그러면 p1에 잠금이있는 경우 쿼리를 시도하기 전에 다른 스레드가 항상 잠금 함수를 호출하기 때문에 잠금 기능이 잠금 해제를 기다리고 있기 때문에 질문에 대한 대답이라고 생각합니다. 결과는 다음과 같습니다. 다른 스레드로부터의 쿼리 잠금 해제를 기다릴 것입니다 (즉 모든 스레드가 항상 잠금을 호출하고 잠금이 잠금 해제를 대기하기 때문에).

+0

재귀 mutex가 제 기능을했습니다. :디 – jetru

2

예, 디자인이 잘못되었습니다.

데이터베이스에서 잠금을 수행해야합니다. 나는 그러나, 질문/디자인을 이해했는지 모르겠어요

+1

동의합니다. 이것은 현대 데이터베이스가 처리 할 수있는 것입니다. 데이터베이스, 테이블 또는 행 수준에서 잠글 수 있습니다. 읽기 및 쓰기 용으로 잠글 수 있습니다. 일반적으로 트랜잭션을 사용하는 것이 잠금보다 낫지 만 더 많은 정보가 없으면 더 말할 수 없습니다. – Schwern

0

글쎄, 자물쇠 및 잠금 해제 구현을위한 lookng입니까? 다음은 중요한 섹션을 달성하는 방법에 대한 개요입니다. 이 함수를 사용하여 함수를 구현할 수 있습니다.

pthread_mutex_t mutex; 
pthread_mutex_init(&mutex, NULL); 
pthread_mutex_lock(&mutex); 
queryN(); // critical section 
pthread_mutex_unlock(&mutex); 

데이터베이스가 단일 프로그램에서만 액세스 할 수있는 경우 해당 기능이 작동합니다. 나는 당신의 쿼리가 r/w하고 있다면, 귀하의 데이터베이스가 테이블/행의 잠금을 어쨌든 적절하게하고 있다고 생각합니다.

모든 검색어가 잠금 및 잠금 해제로 둘러싸여 있으면 원하는 것을 얻을 수 있습니다.

0
  • 데이터베이스에서 잠금을 처리하는 경우. SQL 데이터베이스가 있으면 트랜잭션이 명시 적으로 시작되거나 첫 번째 SQL 문에서 트랜잭션이 시작되고 커밋 작업이 종료됩니다. 공유 데이터를 사용하는 경우 프로그램을 동기화 (예 : 대기열 사용)해야합니다.

  • 데이터베이스가 잠금을 처리하지 않는 경우

    후 잠금 장치처럼 사용되어야합니다 :

    START_TRANSACTION = pthread_mutex_lock

    END_TRANSACTION = pthread_mutex_unlock

하지만 롤백 처리가되지 않고 일관성에 대한 보호.

관련 문제