예를 들어, 데이터베이스의 필드에 +1 을 해야하는 경우, 동시에 복수의 이용자가 업데이트를 해 버리면 대략 난감...
혹은 업데이트 하는 중간에 뭔가 문제가 생겨서 변수만 증가되고 데이터베이스에는 업데이트가 이루어지지 않고 끝난다던가..
여러가지 문제가 있을 수 있으므로 이런 경우에는 동시에 데이터베이스 입력이나 수정을 못 하게끔 잠글 필요가 있다.
논리적으로 락을 걸 수 있으나 (디비에 필드 만들어서 켜 있는 경우에는 입력변경 금지 시키고 꺼 있는 경우에는 가능하게끔) 데이터베이스의 트렌젝션을 이용해도 된다는 이야기에 솔깃해서 찾아보니 cakephp3 에도 기본적인 트렌젝션은 패키지로 제공하고 있더라.
음..제대로 움직이는지 아직 테스트를 안 해봐서 모르겠지만 일단 에러없이 돌아는 간다.
> SectionController.php
|
<?php
namespace App\Controller;
// 요 세 개 추가요~
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Exception;
// 필요한 곳에 다음과 같이 기술함.
public function add()
{
$connection = ConnectionManager::get('default');
$connection->begin();
try
{
// 다른 코드 생략...+1하고 업데이틑 하는 부분만 정리
if(isset($master))
{
$current_idx = $master->current_idx + 1;
$query = $this->Masters->query();
$query->update()
->set(['current_idx' => $current_idx])
->where(['customer_idx' => $customer_idx])
->execute();
$connection->commit();
}
else
{
$this->Flash->error(__('에러다에러에러에러에러에러에러에러'));
}
}
catch(Exception $e)
{
$connection->rollback();
}
}
|
계속 조금씩 배워가며 어찌어찌 만들고는 있는데 영...불안한 것이 바로 이런 예외처리나 보안관련처리를 거의 안 하고 있다는 점...
뭔가 불안하기는 한데 어찌 처리해야 할지를 모르니 정말 예쁘고 바르게 이용하면 잘 돌아가나 조금만 삐딱한 마음 먹으면 여러가지 병크를 일으킬 수 있는 시스템이 되어...버리고 있다 ㅠㅠ
뭐..나중에 테스트 할 때 까이면서 배우는 수 밖에 없으려나 쿨럭
댓글
댓글 쓰기