트랜잭션에 Select 문 삽입


10

이 두 쿼리의 차이점은 무엇입니까?

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

그리고 거래없이 :

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

SELECT내부 거래 를하면 어떤 효과가 있습니까?

경우 DELETE FROM orders WHERE id=1우측 후 다른 세션에서 호출 된 SELECT두 경우 모두이 때 처리 할 것인가?

답변:


5

트랜잭션 내부의 SELECT 쿼리 자체는 UPDATE 및 DELETE로부터 제대로 보호되지 않습니다.

다음을 사용해야하는 것 :

발행하면 Delete From orders Where id=1, orders테이블 의 행 이 트랜잭션 종료시 잠금을 해제 한 후에 발생 합니다. READ UNCOMMITTED트랜잭션 격리 수준을 사용하여 삭제를 논리적으로 수행 하는 실험 (개발자 / 준비 서버에서 수행) 을 시도 할 수 있지만 커밋시에만 영구적으로 표시되고 기록됩니다.

두 번째 거래에서는 기본적으로 모든 베팅이 해제됩니다. 당신이 실행하는 경우

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

실행 Delete From orders Where id=1하면 즉시 커밋됩니다. MySQL이 이러한 명령문을 실행하는 순서에 따라 삭제 행이 표시되거나 표시되지 않습니다.

경고

MySQL 5.6은 이제 다음을 갖습니다 .

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

READ WRITE 및 READ ONLY 한정자는 트랜잭션 액세스 모드를 설정합니다. 트랜잭션에 사용 된 테이블에 대한 변경을 허용하거나 금지합니다. 읽기 전용 제한 사항은 트랜잭션이 다른 트랜잭션에 표시되는 트랜잭션 및 트랜잭션이 아닌 테이블을 수정하거나 잠그지 못하게합니다. 트랜잭션은 여전히 ​​임시 테이블을 수정하거나 잠글 수 있습니다. 이 수정자는 MySQL 5.6.5부터 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.