여러 상담원이 하나씩 테이블에서 고객을로드하는 C#에서 콜 센터 프로그램을 작성하고 있습니다. 둘 이상의 에이전트가 동일한 고객을로드하지 못하게하기 위해 테이블에 행이 잠겨 있음을 나타내는 새 필드를 추가했습니다. 행을 선택하면 해당 행을 업데이트하고 해당 행을 선택한 에이전트의 ID로 잠금 필드를 설정합니다. 하지만 문제는 내가 행을 선택하고 잠그는 동안, 다른 에이전트가 아직 잠겨 있지 않기 때문에 동일한 행을 선택할 수 있습니다! 이 상황을 처리 할 수있는 방법이 있습니까? 데이터베이스는 MySQL의 5/이노다른 세션에서 UPDATE가 발생하기 전에 행을 SELECT하는 것을 방지하는 방법
0
A
답변
1
당신은 에이전트 당 1 개 프로파일을 잠글 수 있습니다 가정입니다 : 내가 업데이트를 실행하기 전에 내가 ID를 선택해야
--Check for no lock
UPDATE T SET LockField = 'abc' WHERE ProfileId = 1 AND LockField IS NULL;
--Check to see if we updated anything.
--If not, we can't show this row because someone else has it locked
SELECT ROW_COUNT();
...
UPDATE in 1 명령문을 수행하면 그렇지 않습니다. 아주 쉽게
--Check for no lock
UPDATE T SET LockField = 'abc' WHERE ProfileId = (
SELECT ProfileId FROM T WHERE LockField IS NULL LIMIT 1
);
--Check to see what we updated
SELECT * FROM T WHERE LockField = 'abc';
작품 :처럼하지만 뭔가 - 우리는 MySQL의 구문의 내 지식 지난 조금 있어요. 당신은 좀 더 복잡 할 경우
(또는 MySQL의 서브 쿼리를 지원하지 않습니다), 당신은 ... FOR UPDATE SELECT와 업데이트 잠금을 사용할 수 있습니다
START TRANSACTION;
--Put an update lock on the row till the xaction ends
--any other SELECT wanting an update lock will block until we're out of the xaction
SELECT @id = ID FROM T WHERE LockField IS NULL LIMIT 1 FOR UPDATE;
UPDATE T SET LockField = 'abc' WHERE ID = @id;
COMMIT TRANSACTION;
0
확인 LOCK TABLES
및 UNLOCK TABLES
을 :
http://dev.mysql.com/doc/refman/5.6/en/lock-tables.html
당신은 마크의 대답과 함께이를 사용할 수 있습니다.
0
설명하는 내용은 Optimistic Concurrency vs. Pessimistic Concurrency입니다.
관련 문제
- 1. setContentView 문제가 발생하기 전에 코드
- 2. 항아리에서 클래스를로드하는 것을 방지하는 방법
- 3. css가 상속하는 것을 방지하는 방법?
- 4. 애니메이션이 발생하기 전에 UIView 회전하기
- 5. // = require가 발생하기 전에 javascript를 실행하십시오.
- 6. ViewFlipper가 루핑되는 것을 방지하는 방법
- 7. UITextField로 이동하는 것을 방지하는 방법?
- 8. 다른 경고음 발생하기
- 9. 데이터베이스가 따옴표에 슬래시를 추가하는 것을 방지하는 방법
- 10. 리디렉션이 발생하기 전에 캡처 또는 경고합니다.
- 11. 아포스트로피가 제거되는 것을 방지하는 방법 PHP MySQL
- 12. 사이트에서 PHP로 이미지를 긁어내는 것을 방지하는 방법
- 13. 한 요소의 하위 요소가 다른 요소 위에있는 것을 방지하는 방법
- 14. 사용자가 다른 사용자에게 댓글을 남기는 것을 방지하는 방법
- 15. 내 응용 프로그램에서 다른 응용 프로그램을 시작하는 것을 방지하는 방법
- 16. 다른 사용자가 여러 번 투표하는 것을 방지하는 방법
- 17. 이벤트 리스너가 발생하기 전에 ActionScript 3에서 XML로드하기
- 18. DIV가 서로 슬라이딩하는 것을 방지하는 방법
- 19. UIButton, 이중 동작이 발생하는 것을 방지하는 방법
- 20. 문제가 발생하기 전에 프로그램이 디버거에서 충돌합니다.
- 21. MySQL 삽입 트리거 구문 오류가 발생하기 전에?
- 22. WPF는 특정 이벤트가 발생하기 전에 함수를 실행합니까?
- 23. ruby에서 rspec 오류가 발생하기 전에 각각
- 24. 헤더 문제가 발생하기 전에 헤더가 전송되지 않습니다.
- 25. 정규식 : 마지막 발생하기 전에 텍스트를 필터링
- 26. Date.JS 구문 분석은 문제가 발생하기 전에
- 27. SWT ExpandListener는 Linux에서 축소가 발생하기 전에 실행합니다.
- 28. 제출 jQuery 검사기가 발생하기 전에 제출
- 29. EF4가 모든 어셈블리를 동적으로로드하는 것을 방지하는 방법
- 30. Datepicker에서 날짜를 선택하기 전에 isNaN을 방지하는 방법
어떤 기준에 따라 '테이블에서 하나씩'을 씁니까? 가장 오랜 시간 동안 탁자에 있던 사람? – MiMo