Laravel 웅변 ORM 트랜잭션
PDO와 같은 방법으로 MySQL 트랜잭션을 쉽게 셋업할 수 있는 방법이 있을까요?아니면 ORM을 확장해야 하나요?
다음과 같이 할 수 있습니다.
DB::transaction(function() {
//
});
Closure 내부의 모든 것은 트랜잭션 내에서 실행됩니다.예외가 발생하면 자동으로 롤백됩니다.
익명 기능을 원하지 않는 경우:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
업데이트: larabel 4의 경우pdo
개체가 더 이상 공개되지 않으므로:
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
웅변법을 사용하고 싶은 경우는, 이것 또한 사용할 수 있습니다.
이것은 제 프로젝트의 샘플 코드입니다.
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
폐쇄를 피하고 싶다면, 그리고 파사드를 사용하는 것이 좋다면, 다음을 통해 물건을 깨끗하고 깨끗하게 유지할 수 있습니다.
try {
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
} catch (Throwable $e) {
\DB::rollback();
}
어떤 스테이트먼트가 실패해도 커밋은 히트하지 않고 트랜잭션은 처리되지 않습니다.
폐쇄 솔루션을 찾고 있지 않을 것입니다. 보다 콤팩트한 솔루션을 위해 이 솔루션을 사용해 보십시오.
try{
DB::beginTransaction();
/*
* Your DB code
* */
DB::commit();
}catch(\Exception $e){
DB::rollback();
}
이 정보는 어디서도 찾기 어렵기 때문에, 웅변적인 거래와 관련된 제 이슈가 이것을 완전히 바꾸고 있었기 때문에, 저는 여기에 올리기로 했습니다.
이 stackoverflow 답변을 읽고 데이터베이스 테이블이 InnoDB가 아닌 MyISAM을 사용하고 있음을 알게 되었습니다.
트랜잭션이 Laravel(또는 보이는 다른 곳)에서 작동하려면 테이블이 InnoDB를 사용하도록 설정되어야 합니다.
왜요?
MySQL Transactions and Atomic Operations 문서 인용(여기서):
MySQL Server(버전 3.23-max 및 모든 버전 4.0 이상)는 InnoDB 및 BDB 트랜잭션 스토리지 엔진과의 트랜잭션을 지원합니다.InnoDB는 완전한 ACID 컴플라이언스를 제공합니다.14장 "스토리지 엔진"을 참조하십시오.트랜잭션 오류 처리와 관련하여 표준 SQL과의 InnoDB 차이점에 대한 내용은 섹션 14.2.11 "InnoDB 오류 처리"를 참조하십시오.
MySQL Server의 다른 비트랜잭션 스토리지 엔진(예: MyISAM)은 "원자적 운영"이라는 데이터 무결성에 대한 다른 패러다임을 따릅니다.트랜잭션 측면에서 MyISAM 테이블은 효과적으로 항상 autocommit = 1 모드에서 작동합니다.원자적 운영은 종종 더 높은 성능과 동등한 무결성을 제공합니다.
MySQL Server는 두 가지 패러다임을 모두 지원하므로 응용 프로그램이 원자성 작업 속도 또는 트랜잭션 기능 사용에 가장 적합한지 여부를 결정할 수 있습니다.이 선택은 테이블 단위로 할 수 있습니다.
예외가 발생하면 트랜잭션이 자동으로 롤백됩니다.
Laravel 기본 트랜잭션 형식
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}
언급URL : https://stackoverflow.com/questions/15105640/laravel-eloquent-orm-transactions
'it-source' 카테고리의 다른 글
PHP에서 플랫폼 독립 디렉토리 구분자를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.21 |
---|---|
LIKE 절을 사용할 때 인덱스 예외를 적용하시겠습니까? (0) | 2022.10.21 |
문자열로 PHP 클래스 인스턴스 만들기 (1) | 2022.10.21 |
Facebook은 브라우저의 통합 개발자 도구를 어떻게 비활성화합니까? (0) | 2022.10.21 |
jQuery에서 JSON으로 시리얼화 (0) | 2022.10.21 |