2011-03-11 4 views
0

사용자가 항목을 평가할 수있는 작은 웹 응용 프로그램을 구축하고 있습니다. 내 응용 프로그램에서 nhibernate 및 asp.net mvc 사용하고 있습니다.nhibernate가 업데이트 할 기회가 없습니까?

모든 등급 요청은 jquery (ajax/post)에서 전송합니다. 사용자가 항목에 투표하면 해당 항목이 이전에 투표되었는지 확인합니다. 그렇다면 마지막 투표 값을받은 새 값으로 업데이트합니다. 그렇지 않다면 테이블에 새 등급을 추가하기 만하면됩니다.

나는 아주 이상한 것을 발견했습니다. 이것은 잘 작동하지만, 몇 번 클릭하면 정말 빠르게 엉망이됩니다. 나는 여러 등급을 얻는다. 마치 nhibernate가 사용자가 이전에 투표를하고 단지 false 값을 반환했는지 확인하는 것을 방해하지 않는 것처럼 보인다.

이것이 가능합니까? 후드 아래에서 무슨 일이 일어나는지 어떻게 알 수 있습니까?

고마워요.

답변

2

아마도 동시성 문제가 있습니다. 난 당신이 클릭당 스레드와 거래를 얻을 것으로 가정합니다. 매우 빠르게 클릭하면 다른 사람들이하는 일을 볼 수없는 병렬 트랜잭션이 발생합니다.

데이터베이스에없는 항목 (새 투표)은 잠글 수없는 일반적인 문제가 있습니다.

솔루션은 다음과 같습니다

  • 사용 lock 동시에 저장되는 동일한 사용자의 여러 표를 피하기 위해. 잠금이 AppDomain으로 제한되어 있기 때문에 동일한 데이터베이스에 여러 서버 (또는 AppDomains)가있는 경우에는 작동하지 않습니다.
  • 데이터베이스에서 테이블 잠금을 사용하면 하나의 트랜잭션 만 투표를 동시에 추가 할 수있는 전체 투표 테이블을 잠글 수 있습니다.
1

NHibernate 로깅을 켰습니까?

는 hibernate.config.xml 파일에 다음을 추가

<property name="show_sql">true</property> 

당신이 단위 테스트를 실행하는 경우 콘솔 또는 테스트 러너 출력에서 ​​볼 수 생성 된 SQL. 당신은 또한 파일에 NHibernate 로깅 정보를 기록하도록 log4net을 구성 할 수 있습니다 (https://web.archive.org/web/20110514164829/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/07/01/how-to-configure-log4net-for-use-with-nhibernate.aspx 참조)

마지막으로 NHibernate를 어떻게 사용하고 있습니까? 저장소 패턴을 사용하고 있습니까? 코드에 대한 아이디어가 없으면 응용 프로그램의 문제점을 판별하기가 어렵습니다.

+0

예, 저장소 패턴을 사용하고 있습니다. – vondip

관련 문제