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
상태를 설정하려면 다음 표 고려하십시오.
나는 같은 행을 업데이트하고 inqueue
1
에를 설정하는 방법이 후 행
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.
합니다. 그러나'SELECT' 질의에 의해 선택된 행들을 갱신하는데 어떤 질의를 사용할 것인가? – kaysush
@kaysush - 업데이트를 확인하십시오. –
당신의 솔루션을 시도했지만 프로 시저를 호출하면 'ERROR 1746 (HY000) :'zzz_EmailQueue '이 생성되는 동안'emailqueue '테이블을 업데이트 할 수 없습니다.'라는 메시지가 표시됩니다. 업데이트를 확인하십시오. – kaysush