그래서 많은 mysql 작업을 수행하는 큰 C++ 코드 기반을 물려 받았습니다. 코드는 항상 자동 커밋을 비활성화하고 다음과 같이 기능을 갖는 경향이있다 :자동 커밋이 발생하고 롤백이 발생하지 않습니다.
int function() {
if(mysql_real_query(conn, ...)) {
return -1;
}
if(mysql_real_query(conn, ...)) {
return -1;
}
mysql_commit(conn);
return 0;
}
물론, 여기에 의사가이 쿼리가 성공하는 경우에만 발생 커밋이다. 그러나 그들 중 하나가 아닌 경우 어떻게됩니까? 결국, mysql 연결은 제대로 닫히지 만 코드에는 롤백이 없습니다.
그래서 닫히면 기본적으로 성공한 변경 사항을 적용하겠습니까? 아니면 아무 일도 없었던 것처럼 롤백 할 것인가?
내 첫 번째 쿼리가 성공적으로 실행 취소되기 위해 두 번째 쿼리가 실패하면 롤백하는 것이 좋습니다. 따라서이 함수는 트랜잭션으로 끝납니다.
물론 이전의 일부 작업이 실패하면 나중의 다른 mysql 코드가 "이상한"상태로 물건을 남길 수 있기 때문에이 코드가 본질적으로 고장났습니다. 그러나 프로그램의 동작을 바꾸기 전에, 나는 현재의 행동이 무엇인지를 이해하고 싶었습니다.
쉽게 테스트 할 수 있습니다. 트랜잭션을 시작하고 몇 가지 작업을 수행 한 다음 연결이 끊긴 상태에서 프로그램을 종료합니다. 변경 사항이 커밋되었는지 확인 / –