질문/조언질답게시판

스케줄 모듈에 아래와 같은 문구가 있는데

 

$oDB = DB::getInstance();
$oDB->begin();

 

라이믹스 2.0.4 develop 업데이트 이후 (PHP7.0, CAFE24호스팅)

해당 소스를 주석처리 하지 않으면 스케줄 작성이나 삭제가 되지 않는데 (DB에 입력이나 삭제가 안되는듯해요)

해당 부분을 주석처리해도 괜찮을까요?

  • profile
    쿼리 이후 $oDB->commit(); 을 해 주셔야 합니다.
  • profile ?
    아 감사합니다!
  • profile
    https://xetown.com/questions/1496223
    같은 질문인건가요?

    조금 더 자세하게 조치내용을 아려주시면 같은자료 사용하시는 분들이 수정하기 용이할 것 같습니다.
  • profile ?

    네 동일한 내용입니다.
    해결법은 executeQuery()소스가 들어가는 부분 아래에
    $oDB->commit(); 추가로 넣어주시면 됩니다.

     

    혹은 $oDB부분을 전부 삭제해도 됩니다.

  • profile
    $oDB->begin 을쓴다는건 해당 디비값을 쿼리만 만들어놓고 보류하게된다는 뜻이됩니다.

    디비타입이 mysqli_innodb 일경우 사용할 수 있고 해당 값을 미리 어딘가에 저장해놨다가 마지막에 $oDB->commit() 을 실행할경우 실제로 커밋하도록 하는거죠.

    이와같은 방식을 쓰는이유는

    $oDB->begin();

    $output1 = executeQuery(''); // 정상작도
    $output2 = executeQuery(''); // 비정상작동

    한번의 동작실행에서 위와 같은 상황 일때 1번에서 쿼리한 insert항목을 실제로는 쿼리하지 않고 데이터만 가지고 있다가 2번에서 동작 실행이 오류나서 1번이 디비에 입력되지 않아야 하는경우에 사용되는겁니다.

    2번에서 에러가 있어서 1번데이터가 입력됬는지 아닌지 확인할 수 없고 해당 데이터를 지워야 하는 상황이라면 복잡해지거든요 ㅎㅎ

    그래서 다음과 같이 미리 예약시키는 방법으로 커밋을 보류햇다가 마지막에 한번에 디비 입력을 시킨다는 뜻입니다.
  • profile profile
    https://github.com/bjrambo/xe-module-schedule/blob/master/schedule.controller.php#L23
    https://github.com/bjrambo/xe-module-schedule/blob/master/schedule.controller.php#L106

    두군데 등장하는거 같네요.
  • profile profile
    그러면 $oDB->rollback(); 이나 $oDB->commit(); 둘 중 아무거나 사용해도 괜찮은 건가요?
  • profile profile
    $oDB->rollback(); 은 지금까지 쿼리햇던 모든 디비를 저장하지 않고 파기하겠다는것이고요.

    $oDB->commit();을 해야 최종적으로 저장했던 모든디비를 입력한다는 뜻이됩니다.
  • profile profile
    예전에 만든 모듈이라 그런지 마지막에 커밋을 하지 않았네요.

    아마도 개발당시에는 이노디비를 사용하지 않았던 시기고.. 제 지식도 부족했던 당시 만들었던 상황이라 $oDB->commit()을 해야한다는걸 모르고 만들었을겁니다. 그런데 mysam 방식은 아시다시피 commit을 하지 않더라도 실제로 디비에 입력이 되기 때문에 innodb으로 업그레이드한 데이터베이스에서 문제가 되는것이죠..
  • profile profile
    아하~ 그럼 $oDB->rollback(); 자리를 $oDB->commit(); 로 대체해야 하는 거죠?
  • profile profile
    아, 아니군요. rollback은 insert에 문제가 있을 때 쓰는 거군요.
    별도로 $oDB->commit();를 넣어야 하는 거네요.
    이제야 이해했습니다ㅋㅋ
  • profile profile
    넵 insert에 문제가 생겼을때 임시로 넣어둔게 롤백입니다.

    그래서 그걸 건드리지 말고 따로 commit을 넣어야 하는거죠