Optimistic Locking

git에서도 그렇지만 여러사람이 동시에 같은 버전의 정보를 수정해 올리면 충돌이 일어난다. 이때 (버전은 동일하지만) 시간적으로 나중에 수정한게 무조건 좋은 결과물이라고 할수도 없으므로 하나가 이미 저장되어있는 버전을 덮어쓰는것도 이상하다. 이런상황을 위해 Optimistic Locking이라는것이 존재한다.

lock_version

lock_version 테이블이 수정될때마다 숫자가 알아서 1씩 증가한다.

rails g scaffold post content lock_version:integer

기본값을 0으로 지정해준뒤 게시물을 만들어 수정하고 숫자가 증가했는지 확인해본다.(당연히 잘된다)

#2017xxxxxxxxxx_create_posts.rb

#...
    t.integer :lock_version, default: 0

Error

이제 예외를 핸들링해보자. 같은 버전의 게시물을 동시에 수정하면 ActiveRecord::StaleObjectError 가 발생한다. 에러가 발생하면 내용이 증발될수도 있으니, 충돌했다는 메시지와 함께 이전에 작성하던 내용을 보여주도록 하자.

# posts_controller.rb

def update
    #...

    rescue ActiveRecord::StaleObjectError
        flash[:notice] = "충돌이 발생했습니다."
        render :edit
end

edit 페이지에서 메시지를 출력한다.

<% if flash[:notice] %>
    <div class="notice"><%= flash[:notice] %></div>
<% end %>

참고

results matching ""

    No results matching ""