2009-03-30 7 views
8

여러 페이지에 걸쳐있는 양식이 있습니다. 데이터베이스가 제출 될 때 각 페이지를 (데이터베이스에) 저장하기 때문에 지금 설정되는 방식은 이상적이지 않습니다. 따라서 사용자가 모든 페이지에서 양식을 완료하지 않으면 불완전한 사용자 등록이 데이터베이스에 저장됩니다.데이터베이스 트랜잭션을 레일스에서 ​​여러 요청으로 확장 할 수 있습니까?

사용자가 양식을 완전히 채우지 않은 경우 저장을 '롤백'하고 싶습니다.

사용자가 첫 번째 양식을 작성하고 마지막 페이지에서 사용자가 완료 할 때 시작될 트랜잭션을 설정하는 방법이 있습니까?

답변

1

나는 당신의 원래의 질문에 대한 답을 알고 있지만, 어쨌든 ...

대신 모든 페이지에 절약, 왜 세션 변수에 모든 데이터를 저장하지? 그런 다음 세션에서 데이터를 데이터베이스에 저장하는 한 페이지를 가질 수 있습니까? 이렇게하면 DB에 부분적으로 아무것도 저장할 수 없습니다.

1

장기 실행 프로세스이고 사용자가 중간에 중단되면 중간 중간의 커밋되지 않은 결과를 저장하고 나중에 중단 한 부분을 선택하기 때문에 각 페이지를 저장하는 것이 가치 있다고 생각합니다.

생각해 보니 좋은 생각인데 디자인에 특정 조각이 아직 완료되지 않은 장기 실행 트랜잭션의 일부인지 여부를 나타내는 플래그가 저장됩니다. 마지막 부분이 끝나고 저장 버튼이 눌려 졌을 때 플래그를 설정하십시오. 중간 조각에 일정 기간이 경과 한 후 "최종 저장"승인을받은 경우 시간 제한 값을 지정하십시오.

1

여러 요청에 걸쳐있는 데이터베이스 트랜잭션을 여는 것은 좋지 않습니다. 트랜잭션이 커밋되기 전에 사용자가 브라우저를 닫는 상황을 고려하십시오. 롤백 또는 커밋되지 않은 고아 트랜잭션이 남아 있습니다.

데이터베이스에 REG_COMPLETE와 같은 플래그를 넣으면 등록 프로세스의 마지막 페이지에만 설정됩니다. 그런 다음 불완전한 레코드로 원하는 것을 필터링하거나 제거 할 수 있습니다. 끝내라는 메시지를 이메일로 보낼 수 있습니까?

2

특정 질문에 대답하려면 데이터베이스 감각으로 원하는대로 할 수있는 트랜잭션을 설정하는 방법이 없다고 생각합니다. 생각해 보면 다음과 같은 이유가 있습니다. 다중 페이지 작업의 여러 부분이 동일한 프로세스에서 처리된다는 보장이 없습니다. 또는 동일한 서버 일 가능성이 큽니다. 이 상황에서와 같이 요청이 데이터베이스 연결에 걸쳐 있으면 한 연결의 커밋되지 않은 부분이 다른 연결에서 보이지 않습니다.

이미 언급 한 아이디어뿐만 아니라 이미 입력 된 불완전한 데이터를 보관하기 위해 하나 이상의 "스테이징"테이블을 사용할 것을 고려합니다. 그런 다음 사용자가 완료되면 단일 트랜잭션이 영구 테이블에 데이터를 적용하고 준비 데이터를 제거 할 수 있습니다. 불완전 데이터는 세션이 종료되었거나 사용자가 반환 할 때까지 기다렸다가 자신의 요구 사항을 더 잘 충족 할 경우 백그라운드 프로세스에 의해 연령 기준에서 지워질 수 있습니다.

정기적으로 불완전한 트랜잭션이 발생할 것으로 예상되는 경우 특히이 방법에 의지 할 것입니다.이 방법을 사용하면 주 모델에서 불완전한 데이터를 처리 할 필요가 없기 때문입니다.

관련 문제