나는 원자 적으로 소유하고 싶은 리소스 테이블을 가지고있다. 그러면 나는 방금 요청한 자원에 대한 정보를 원합니다. 한 사용자 당 하나 개의 자원의 한계가 있다면mysql에서 UPDATE를 사용하여 행 또는 리소스를 원자 적으로 클레임하는 방법
, 나는 다음과 같은 트릭을 수행 할 수 있습니다
UPDATE cars SET user = 'bob' WHERE user IS NULL LIMIT 1
SELECT * FROM cars WHERE user = 'bob'
이 방법, 나는 원자 자원을 주장하고 난 그냥 주장하는 행을 볼 수 있습니다.
'밥'이 여러 자동차를 소유 할 수있는 경우에는 작동하지 않습니다. 나는 내가 밥에 의해 벌써 요구하게되는 차의 목록을 알아들을 수 있고, 또 다른 하나를 요구할 수 있고, 그 다음 SELECT
가 무엇이 바뀌 었는지에 관해 알기 위해 다시 알 수있다. 그러나 그것은 hackish를 느낀다.
궁금한 점은 마지막 업데이트로 업데이트 한 행을 확인할 수있는 방법이 있습니까?
오류가 발생하면 행을 원자 적으로 요청하는 다른 트릭이 있습니까? 난 정말 SERIALIZABLE
격리 수준을 사용하지 않으려합니다. 나는 같은 것을 할 경우 :
1 SELECT id FROM cars WHERE user IS NULL
2 <here, my PHP or whatever picks a car id>
3 UPDATE cars SET user = 'bob' WHERE id = <the one i picked>
는
REPEATABLE READ
여기에 충분할 것이다? 즉, 다른 거래가 2 단계에서 소프트웨어가 선택한 행을 주장하지 않을 수 있습니까?
발견 : http://stackoverflow.com/questions/1821142/atomically-mark-and-return-a-group-of-rows-in-database SQL 서버에 대해 물어 보았습니다 - 나는 MySQL에 해당하는 –