book:
id: primary key, integer
title: varchar
borrowed: boolean
borrowed_by_user_id: foreign key user.id
user:
id: primary key, integer
name: varchar
blocked: boolean
에 제약을 존중 테이블의 행.업데이트는 PostgreSQL의 기본적 수준 (이 요구 사항은 내게되지 않음) 때문에, 다른 테이블 분리 레벨이 최선을 다하고을 읽어
도서를 SELECT FOR UPDATE
에 데이터베이스 트랜잭션 하나를 사용하고 책을 아직 대여하지 않은 경우 모든 사용자에게 빌려주고 있습니다. 이 책은 FOR UPDATE
으로 선택되었으므로 동시에 빌릴 수 없습니다.
그러나 또 다른 문제가 있습니다. 차단 된 사용자에게 책을 대여하도록 허용 할 수 없습니다. 어떻게 확인할 수 있습니까? 사용자가 차단되지 않았는지 처음에 확인해도 동시 트랜잭션으로 인해 사용자가 차단 될 수 있으므로 체크를하면 결과가 올바르지 않을 수 있습니다.
예를 들어 관리자 패널의 동시 트랜잭션으로 사용자를 차단할 수 있습니다.
어떻게 문제를 해결할 수 있습니까? 내가 SERIALIZABLE
를 사용할 수있는
- 나는 참조하십시오. 처리 오류가 필요해, 네?
- 어떻게
CHECK
이 작동하는지 잘 모르겠습니다. 그것에 대해 더 많이 말해 줄 수 있습니까?
약 어떨까요? 'SELECT * FROM book INNER JOIN 사용자가 book.borrowed_by_user_id = user.id user.blocked FOR UPDATE하지 않은 곳은 어디입니까? – asdas
차단되지 않은 모든 사용자를 잠그고 그러한 책을 모든 사용자에게 대여합니다. 그게 무슨 소용입니까? –
'SELECT * FROM book INNER JOIN 사용자가 book.borrowed_by_user_id = user.id user.blocked가 아닌 곳과 book.id = 100 FOR UPDATE' 이제 내 게시물의 의미에서 안전한가요? – asdas