2012-06-08 2 views
1

PHP와 Mysqli로 작성된 복잡한 데이터베이스 응용 프로그램을 작성 중입니다. 대규모 데이터베이스 작업의 경우 백그라운드에서 작동하는 데몬 (PHP도 있음)을 사용하고 있습니다. 이러한 작업 중에 몇 분이 걸릴 수 있지만 사용자가 영향을받는 데이터에 액세스하지 못하도록하고 대신 메시지를 표시하려고합니다.PHP/MySQL : 행을 임시로 삽입하십시오.

특정 데몬 작업이 발생할 때마다 Mysql 테이블을 만들고 행을 삽입하는 방법에 대해 생각했습니다. 그런 다음 데이터에 액세스하는 동안 특정 작업이 수행되는지 항상 확인할 수 있습니다.

그러나 물론, 데몬 프로세스가 어떤 이유로 든 종료되면 (콘솔에서 죽이거나 데이터베이스 연결이 끊어 지거나 플러그가 풀리는 등) 레코드가 데이터베이스에 남아 있지 않는 것이 중요합니다. Mysql 트랜잭션/롤백은 변경을 공개하고 레코드가 종료되면 데이터베이스에 남아 있기 때문에 커밋이 필요하기 때문에이를 수행 할 수 있습니다.

프로세스가 종료되면 레코드가 삭제되도록하는 방법이 있습니까?

+1

모든 데몬이 한 서버에서 호스팅됩니까? – arik

+0

예, 모든 것이 현재 한 서버에서 호스팅됩니다. 그러나 응용 프로그램이 공개되면 데이터베이스를 별도의 서버로 이동합니다. – 1nsane

+0

데이터베이스의 서버에 관계없이 모든 데몬이 하나의 서버에있는 경우 간단히 파일을 업데이트하고 업데이트 시간을 기록 할 수 있습니다. 파일에 저장된 시간 소인이 10 초 미만인지 여부를 점검하고, 그렇다면 조치를 허용하지 마십시오. 그렇게하면 실행중인 데몬에서 해당 파일을 간단히 업데이트해야하며 정통성을 잃어 버리지 만 나중에 처리하는 데 영향을 미치지 않습니다. – arik

답변

2

이것은 흥미로운 문제입니다. 몇 년 전에 대학 과정을 위해 실제로 구현했습니다.

제가 사용한 트릭은 트랜잭션 격리와 함께 게임하는 것입니다. 데몬이 진행 중임을 나타내는 레코드를 만들지 만 커밋하지 않으면 다른 클라이언트가 해당 레코드를 볼 수 없다는 점에서 정확합니다. 그러나 해당 클라이언트의 격리 수준을 READ UNCOMMITTED로 설정하면 진행 상태임을 나타내는 레코드가 표시됩니다. READ UNCOMMITTED는 아직 커밋되지 않은 다른 클라이언트의 변경 사항을 표시하기 때문입니다. (데몬은 기본 격리 수준으로 남게됩니다.)

클라이언트의 격리 수준은 해당 데몬 검사에만 커밋되지 않은 채로 읽도록 설정해야합니다. 매우 위험 할 수 있으므로 다른 작업에는 해당되지 않습니다.

데몬이 충돌하면 트랜잭션이 중단되고 레코드가 이동합니다. 성공하면 db에서 완료를 표시하거나 레코드 등을 삭제 한 다음 커밋 할 수 있습니다. 데몬이 어떤 이유로 든 실패 할 경우 변경된 모든 변경 사항이 취소되고 다시 시도 될 수 있기 때문에 정말 좋습니다. 당신이 더 많은 설명이나 코드가 필요하면

어디 선가 내 할당을 찾을 수 있습니다 :)이 모두 이노 또는 좋은 트랜잭션 DB 필요로

Transaction isolation levels reference

참고.

+0

그건 재미있어 보여. 나는 그것을 시도해 줄 것이다 :) – 1nsane

+0

매우 잘 작동, 고마워. 다음은 트랜잭션 격리를 사용하여 내 데몬을 한 번에 여러 번 실행할 수없는 간단한 예입니다. – 1nsane

+0

지금은 게시 할 수 없습니다.나는 나중에 게시 할 것이다;) – 1nsane

관련 문제