[RubyOnRails Guides] Active Record Query Interface - 2편


• RubyOnRails에서는 DB 트랜잭션이 2개 이상 진행될 경우 프로세스 내에서 작업하는 쓰레드 자원이 꼬여 경쟁 상태 문제가 발생할 수 있으며, 이를 해결하기 위해 Locking 기능을 제공한다. Locking은 두 개 이상의 작업이 동시에 진행될 경우 이전 작업이 끝날 때까지 대기하게 만드는 것으로, 트랜잭션이 unlock 할 때까지 데이터를 독점적으로 사용할 수 있다.
• Locking에는 낙관적 잠금과 비관적 잠금 두 가지가 있다. 낙관적 잠금은 여러 사용자가 편집을 위해 동일한 레코드에 접근할 수 있으며 데이터와 최소 충돌을 가정하며, lock_version 컬럼을 통해 업데이트를 관리한다. 비관적 잠금은 동일한 레코드에 대한 동시 접근을 허용하지 않는다.
• 데이터베이스에서 사용하는 기본 잠금 메커니즘을 사용하여 특정 행에 대한 exclusive lock을 얻을 수 있으며, 이는 Dead Lock(교착 상태)에 빠질 수 있으므로 트랜잭션 내부에 랩핑하여 사용한다. 또한, lock의 다른 유형을 허용하기 위해 원시 SQL을 메소드에 전달할 수도 있다.
• JOIN은 특정 JOIN 절을 지정해 SQL을 사용하거나, Association 이름을 조인 방법으로 사용할 수 있으며, 단일 연결 조인하는 방법도 있다. 이를 통해 여러 테이블 간의 관계를 효과적으로 관리할 수 있다.

북마크
공유하기
신고하기