2011-04-29 9 views
2

MySQL에서 트리거를 사용하기 시작했는데 문제가 있습니다. 알림 테이블에 뭔가를 삽입 할 때 내 사용자 테이블을 업데이트하고 알림 = 알림 + 1 (사용자에게)을 적용하는 트리거를 작성했습니다. 작동하는 것처럼 보이지만 매분마다 실행되는 'check-cron-script'를 만들었고 users 테이블을 100 % true 값으로 업데이트합니다 (알림 테이블에서 계산). 이 cron은 일부 행을 업데이트하면 전자 메일을 보냅니다. 그 스크립트가 약간의 변경을하면, 그것은 나쁜 값을 가진 user_id를 포함하는 이메일을 보낼 것이다. 예전에 두 개의 이메일 (22:53, 22:54)이 수신되었는데 스크립트가 users 테이블에서 잘못된 값을 찾았고 1 행을 업데이트해야한다고했습니다. 두 이메일은 동일했습니다 (동일한 사용자, 동일한 것). 그리고 저는 지금 무슨 일이 일어 났는지 궁금합니다.MySQL 트리거 문제

UPDATE query: 
INSERT INTO notifications (user_id,title,notification) VALUES (%i,%s,%s) 

AFTER INSERT TRIGGER: 
BEGIN 
IF NEW.`new` > 0 THEN 
UPDATE users SET notifications=notifications+1 WHERE id=NEW.user_id; 
END IF; 
END 

AFTER UPDATE TRIGGER: 
BEGIN 
IF OLD.`new` != NEW.`new` THEN 
IF OLD.`new` > 0 THEN 
UPDATE users SET notifications=notifications-1 WHERE id=OLD.user_id; 
END IF; 
IF NEW.`new` > 0 THEN 
UPDATE users SET notifications=notifications+1 WHERE id=NEW.user_id; 
END IF; 
END IF; 
END 

AFTER DELETE TRIGGER: 
BEGIN 
IF OLD.`new` > 0 THEN 
UPDATE users SET notifications=notifications-1 WHERE id=OLD.user_id; 
END IF; 
END 

notifications.new는 사용자가

알림 테이블이 너무 자주 업데이트되지 않는 (기본값은 1) allready 통지를 읽을 여부를 나타내는 TINYINT, 그래서 내가해야 무엇을 생각했다 일어난 것 같아요. 1. UPDATE 쿼리가 실행되었습니다. 2. TRIGGER 앞에 실행 된 cron이 값을 변경해야했기 때문에 잘못된 원인이었습니다. 3. 트리거가 실행되었습니다. 4 다음에 cron을 실행하면 값이 높아져 cron이 다시 업데이트해야합니다 (동일한 사용자, 동일한 것, 같은 이메일)

그러나 나는 이런 일이 일어날 지 모른다. AFTER TRIGGER가 약간 지연되고, cron이 질의 후, 그러나 TRIGGER 전에 실행될 수 있다면.

답변

0

트리거는 원자 적입니다. tx_isolation=READ-UNCOMMITTED으로 달리지 않는 한 설명 된 시나리오가 불가능합니다.

+0

안녕하세요, 저는 거기를보고 REPEATABLE-READ로 설정했습니다. 그래서 아마도 불가능합니다. 그리고 쿼리와 트리거를 살펴 본다면 내가 쓴 것의 원인이되는 또 다른 문제가 보이지 않습니까? – Kukosk