2011-03-03 5 views
4

아무 것도 발견 할 수 없지만 memcache 지원 트랜잭션을 두 번 확인했습니다.트랜잭션이있는 Memcache?

그렇지 않은 경우 가능성있는 대답 일 가능성이 높습니다. 그렇다면 트랜잭션이있는 환경에서 memcache를 사용하는 올바른 방법은 무엇입니까? 업데이트 할 계획이있을 때마다 DB에서 데이터를 읽지 않아도됩니다. 데이터가 캐시에 있어도 잠금을 설정할 수 있습니까? 예를 들어 일부 데이터를 업데이트하는 스크립트는 다음과 같습니다.

  1. BEGIN; SELECT ... FOR UPDATE;
  2. 계산 ...
  3. UPDATE TABLE ...;
  4. 업데이트 캐시
  5. COMMIT;

데드락이 발생하여 롤백해야하는 경우에 대비하여 업데이트 쿼리를 실행 한 후에 캐시를 업데이트해야한다고 생각합니다. 그러나 다른 스레드가 데이터를 읽으려고 기다리고 실수로 새 데이터로 캐쉬를 업데이트하여 이전 데이터로 덮어 쓸 수 있기 때문에 커밋하기 전에 캐시를 업데이트해야합니다.

올바른 순서가 맞습니까? 거기에 어떤 방법을 업데이 트에 대한 DB를 공격하지 않아도됩니까?

답변

4

Memcache에는 CAS (Check And Set - 또는 Compare And Swap)라는 연산자가있어서 도움이됩니다. PHP 매뉴얼에는 그것에 대한 문서가 있지만 Memcached::cas이지만 다른 라이브러리 및 언어에서도 지원되어야합니다.

0

memcached는 조작이 원 자성 임에도 불구하고이 의미에서 트랜잭션을 지원하지 않습니다. 데이터베이스 트랜잭션 메커니즘을 사용하고 수동으로 (지정된대로) 캐시를 업데이트하거나 this과 같은 트랜잭션 래퍼를 사용할 수 있습니다.