2014-06-15 2 views
0

m < N 인 경우 전체 N 행 중 한 번에 m 개의 행을 읽어야하는 응용 프로그램에서 작업하고 있습니다. 'm'행을 읽을 때마다 같은 테이블에 read이라는 상태를 설정해야합니다. MYSQL 저장 프로 시저에서 동일한 행을 SELECT 및 UPDATE합니다.

예를 들어 내가 읽고 싶은

+------+-------------------------+--------------------------+----------+-------+---------+------+ 
| ID | from_email_address  | to_email_address   | subject | body | inqueue | sent | 
+------+-------------------------+--------------------------+----------+-------+---------+------+ 
| 1 | [email protected] | [email protected] | Subject1 | Body1 |   0 | 0 | 
| 2 | [email protected] | [email protected] | Subject1 | Body1 |   0 | 0 | 
| 3 | [email protected] | [email protected] | Subject1 | Body1 |  0  | 0 | 
| 4 | [email protected] | [email protected]  | Subject1 | Body1 |  0  | 0 | 
| 5 | [email protected] | [email protected]  | Subject1 | Body1 |   0 | 0 | 
| 6 | [email protected] | [email protected] | Subject1 | Body1 |  0 | 0 | 
| 7 | [email protected] | [email protected] | Subject1 | Body1 |  0 | 0 | 
+------+-------------------------+--------------------------+----------+-------+---------+------+ 

한 번에 3 rows을 말할 수 내가 행을 읽은 후 나는 1으로 해당 행의 inqueue 상태를 설정하려면 다음 표 고려하십시오.

나는 같은 행을 업데이트하고 inqueue1에를 설정하는 방법이 후 행

select * from EmailQueue where inqueue=1 LIMIT 3 

을 선택하는 저장 프로 시저에 다음 쿼리를 사용할 수 있습니다.

편집 여기

몇 가지 오류를주고 내가 만든 저장 프로 시저입니다.

DELIMITER $$ 
DROP PROCEDURE IF EXISTS GetUnsentMails; 
CREATE PROCEDURE GetUnsentMails() 
BEGIN 
START TRANSACTION; 
    CREATE TEMPORARY TABLE temp_EmailQueue AS SELECT * FROM EmailQueue WHERE inqueue = 0 LIMIT 5 FOR UPDATE; 
    UPDATE EmailQueue SET inqueue=1 where id in (SELECT id from temp_EmailQueue) AND inqueue = 0; 
COMMIT; 
END 

그것은 당신의 요구 사항을 충족하기 위해 "UPDATE 선택"트랜잭션을 사용하는 제안하기

ERROR 1746 (HY000): Can't update table 'emailqueue' while 'temp_EmailQueue' is being created.

답변

0

를 호출에 오류가 다음과 같은 수 있습니다.

예에 대한 다음 링크를 참조하십시오 :

MySQL 'select for update' behaviour

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

http://www.sqlines.com/mysql/how-to/select-update-single-statement-race-condition

UPDATE를 - 추가하려면 QUERY 예 :

예 :

0123을
....... 
#Before starting procedure 
....... 
START TRANSACTION; 
CREATE TEMPORARY TABLE zzz_EmailQueue AS SELECT * FROM EmailQueue WHERE inqueue=1 LIMIT 3 FOR UPDATE; 
..... 
..... 
#Section for other activities.... 
..... 
..... 
UPDATE EmailQueue SET inqueue=<<New_Value>> WHERE id IN (SELECT id FROM zzz_EmailQueue) AND inqueue=1; 
COMMIT; 
....... 
#Remaining lines of Prodecure 
....... 

업데이트 ** ** 다음과 같은 방법으로 시도해보십시오 괜찮

DECLARE v_EmailQueue_ID DOUBLE; 
SELECT ID INTO v_EmailQueue_ID FROM EmailQueue WHERE inqueue = 0 LIMIT 1 FOR UPDATE; 
UPDATE EmailQueue SET inqueue=1 WHERE id=v_EmailQueue_ID AND inqueue = 0; 
+0

합니다. 그러나'SELECT' 질의에 의해 선택된 행들을 갱신하는데 어떤 질의를 사용할 것인가? – kaysush

+0

@kaysush - 업데이트를 확인하십시오. –

+0

당신의 솔루션을 시도했지만 프로 시저를 호출하면 'ERROR 1746 (HY000) :'zzz_EmailQueue '이 생성되는 동안'emailqueue '테이블을 업데이트 할 수 없습니다.'라는 메시지가 표시됩니다. 업데이트를 확인하십시오. – kaysush

관련 문제