본문 바로가기
MySql

MySQL 트랜잭션 : 커밋 및 롤백

by 베이스 공부 2020. 12. 18.
반응형

롤백을 허용하기 위해 PhpMyAdmin 데이터베이스 엔진을 MyISAM에서 INNODB로 업데이트했습니다.

이것은 내 SQL 쿼리입니다.

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');

결과 :

start transaction;# MySQL returned an empty result set (i.e. zero
rows).
UPDATE jkm_content SET state=1 WHERE title IN ('title-1','title2');# 2 rows affected.

1) 따라서 2 개의 행이 영향을 받았지만 변경 사항이 내 DB 나 웹 사이트에 나타나지 않는다고 설명하는 내용입니다. start transaction 을 사용하면 변경 사항을 시각화 할 수 있습니다 임시 DB에서) 그런 다음 만족하면 쿼리를 "커밋"합니다. (DB 업데이트를 위해 커밋 이 필요하다는 것을 알고 있지만 커밋 하면 변경 사항이 영구적입니다.)

2) 커밋하기 전에 효과를 볼 수 없다면 rollback 의 요점을 얻지 못합니다. 이 두 쿼리의 차이점은 무엇입니까?

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');
ROLLBACK;

3) 내가 옳다면이 기능은 모두 동일합니다.

START TRANSACTION
BEGIN
BEGIN WORK

 

해결 방법

 

1) 모든 변경 사항은 동일한 트랜잭션 내에서 볼 수 있습니다. 만약 당신이

START TRANSACTION;
INSERT INTO MyTable VALUES ('Hi there');
SELECT * FROM MyTable;

출력에는 '안녕하세요'가 포함됩니다. 그러나 두 번째 데이터베이스 연결을 시작하면 첫 번째 연결 내에서 트랜잭션을 커밋 할 때까지 새 행이 표시되지 않습니다. 명령 줄을 사용하여 두 개의 데이터베이스 연결을 사용하여이를 사용해보십시오.

두 개의 데이터베이스 연결 내에서 동일한 트랜잭션을 가질 수 없기 때문에 웹 사이트에서 효과를 볼 수 없습니다 (요청 시작시 새로운 db 연결이 만들어집니다).

2) 커밋되지 않은 모든 트랜잭션은 데이터베이스와의 연결이 닫히면 롤백됩니다. 따라서 이것이 두 가지 쿼리뿐이라면 차이가 없습니다. 그러나 다음과 같은 차이점이 있습니다.

START TRANSACTION;
INSERT INTO MyTable VALUES ('This one would be discarded on rollback');
ROLLBACK;
INSERT INTO MyTable VALUES ('This one will be permanent because not within transaction');  

3) 예, 모두 동일합니다.

 

참조 페이지 https://stackoverflow.com/questions/19890966

 

 

반응형

댓글