database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30019 게시물 읽기
No. 30019
프로그램이 정확히 작동될 수 있는지 봐주세요.
작성자
정담
작성일
2011-07-03 07:55ⓒ
2011-07-03 08:20ⓜ
조회수
7,560

항상 많은 도움감사드립니다.
 
 
200명이 동시에 접속하여 50개의 프로그램 중 1개를 선착순으로 신청하는 프로그램입니다.
 
아래 Lock 구문이 정확히 작동될 수 있는지 봐 주십시오.
 
혹시 더 좋은 방법있으면 가르쳐 주십시오.
 
 

aa = 0
m_no =  request("m_no")
sch_id = Session("m_no")


  SQL = "Lock Tables  tbl1  Write"
  db.Execute(SQL)


SQL = "select  s_ok  from   tbl1 where m_no = "& m_no
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL,db

If Not rs.eof Then

aa = rs(0)
If CInt(aa) > 0 Then

 SQL = "UnLock Tables"
 db.Execute(SQL)


 <script language="javascript">
  alert("이 프로그램은 이미 신청되었습니다  \n\n다른 프로그램을 신청하세요");
  location.href="../index.asp";
 </script>

 rs.close
 Set rs = Nothing

 db.close
 Set db=Nothing


  Response.End

Else

 SQL = "Update  tbl1  Set s_ok = "& sch_id &" where  m_no = "&  m_no
 db.Execute(SQL)


 SQL = "UnLock Tables"
 db.Execute(SQL)


 rs.close
 Set rs = Nothing

 db.close
 Set db=Nothing

<script language="javascript">
 alert("정상적으로 신청되었습니다.");
 location.href="../index.asp";
</script>

End If

 

이 글에 대한 댓글이 총 3건 있습니다.

WRITE 락만 사용하시는 경우, 다음과 같은 상황이 연출될 수 있습니다.

  1. 세션 A에서 SELECT를 수행
  2. 세션 B에서 SELECT를 수행
  3. 세션 A의 SELECT 수행 결과, s_ok값이 0이므로 UPDATE 시도
  4. 세션 B의 SELECT 수행 결과, s_ok값이 0이므로 UPDATE 시도
  5. 세션 A의 WRITE LOCK에 의해 세션 B는 대기
  6. 세션 A의 UPDATE가 완료되고, 세션 B의 UPDATE로 순차적으로 실행 완료
  7. 세션 A/B 모두 '정상적으로 신청되었습니다' 를 리턴하지만, 실제로는 s_ok 값은 세션 B의 값으로 남아있음

따라서, WRITE 락이 아닌 READ / WRITE 락을 활용하셔야할 것 같습니다.

또한, 이와 같은 트랜잭셔널 요청은 스토어드 프로시져 등을 활용하시는 것도 좋은 방법이라 생각됩니다.

 

 

박현우(lqez)님이 2011-07-04 16:33에 작성한 댓글입니다.

박현우님 답변 고맙습니다.

제가 스토어드프로시저는 아직 잘 모릅니다.

현재 상태에서

설명서에는 read 락은 읽기 만 제한하고 write 락은 읽기,쓰기를 제한한다고 되어 있어 write 락을 먼저 걸었습니다.

세션 A가 write 락을 건 후 업데이트 완료 후 락을 풀었으므로 

세션 B는 업데이트된 select 구문을 실행하는 것이 아닌가요.

외람된 부탁입니다만 구문을 좀 수정해주시면 안되겠습니까. 

 

이렇게 걸면 어떻습니까

SQL = "Lock Tables  jinro_subject read, jinro_subject  as tbl1 Write"
  db.Execute(SQL)
 

정담님이 2011-07-04 23:12에 작성한 댓글입니다.
이 댓글은 2011-07-04 23:23에 마지막으로 수정되었습니다. Edit

제가 잘못 적은 것입니다. 혼란을 드려 죄송합니다.

명세를 보니, 말씀해주신 것이 맞습니다. (왜 헷갈렸을까...)

따라서, 로직상으로는 올바른 구문이 될 것 같습니다.

 

박현우(lqez)님이 2011-07-05 07:22에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30025mysql 주민번호 2필드 -> 1필드로 저장 하는 방법은~? [2]
김씨
2011-07-14
9167
30024load data infile 사용시 한글 문제 [1]
끼얏호
2011-07-13
12755
30023C에서 mysql_query함수로 select into outfile 명령사용할 때 [2]
흑흑
2011-07-11
7728
30019프로그램이 정확히 작동될 수 있는지 봐주세요. [3]
정담
2011-07-03
7560
30018MYSQL 5.5 설치후 로그인이 안돼요 [1]
고영훈
2011-06-30
7686
30017도와주세요. ㅠㅠ mysqlbinlog 에 관한 질문입니다.
도와주세요
2011-06-29
7245
30016SELECT - WHERE절 질문드립니다. [1]
렘스
2011-06-24
6917
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.027초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다